Secara teknis, jumlah backslash ganjil, seperti yang dijelaskan dalam dokumentasi .
>>> r'\'
File "<stdin>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
File "<stdin>", line 1
r'\\\'
^
SyntaxError: EOL while scanning string literal
Sepertinya pengurai hanya dapat memperlakukan backslash dalam string mentah sebagai karakter biasa (bukankah itu yang dimaksud dengan string mentah?), Tapi saya mungkin kehilangan sesuatu yang jelas.
Jawaban:
Alasannya dijelaskan di bagian bagian yang saya soroti dengan huruf tebal:
Jadi string mentah tidak 100% mentah, masih ada beberapa pemrosesan backslash yang belum sempurna.
sumber
r"foo\bar\baz" "\\"
(bungkus parens jika ambigu) akan membuat literal tunggal pada waktu kompilasi, bagian pertama adalah mentah, dan hanya bit kecil terakhir yang tidak mentah, untuk memungkinkan backslash tertinggal.Seluruh kesalahpahaman tentang string mentah python adalah bahwa sebagian besar orang berpikir bahwa backslash (dalam string mentah) hanyalah karakter biasa seperti yang lainnya. Bukan itu. Kunci untuk memahami adalah urutan tutorial python ini:
Jadi setiap karakter yang mengikuti garis miring terbalik adalah bagian dari string mentah. Setelah parser memasukkan string mentah (bukan Unicode) dan menemukan backslash, ia tahu ada 2 karakter (backslash dan char yang mengikutinya).
Cara ini:
dan:
Kasus terakhir menunjukkan bahwa menurut dokumentasi sekarang parser tidak dapat menemukan kutipan penutup karena kutipan terakhir yang Anda lihat di atas adalah bagian dari string yaitu backslash tidak dapat terakhir di sini karena akan 'melahap' string penutupan string char.
sumber
Begitulah adanya! Saya melihatnya sebagai salah satu cacat kecil di python!
Saya tidak berpikir ada alasan bagus untuk itu, tapi itu jelas tidak parsing; sangat mudah untuk mengurai string mentah dengan \ sebagai karakter terakhir.
Tangkapannya adalah, jika Anda membiarkan \ menjadi karakter terakhir dalam string mentah maka Anda tidak akan dapat menempatkan "di dalam string mentah. Tampaknya python pergi dengan membiarkan" alih-alih membiarkan \ sebagai karakter terakhir.
Namun, ini seharusnya tidak menimbulkan masalah.
Jika Anda khawatir tidak dapat dengan mudah menulis jalur folder Windows seperti
c:\mypath\
kemudian khawatir tidak, karena, Anda dapat mewakili mereka sebagair"C:\mypath"
, dan, jika Anda perlu menambahkan nama subdirektori, jangan lakukan itu dengan rangkaian string, karena toh itu bukan cara yang tepat untuk melakukannya! menggunakanos.path.join
sumber
Agar Anda dapat mengakhiri string mentah dengan garis miring, saya sarankan Anda dapat menggunakan trik ini:
sumber
Trik lain adalah dengan menggunakan chr (92) saat mengevaluasi ke "\".
Saya baru-baru ini harus membersihkan serangkaian garis miring terbalik dan berikut ini caranya:
Saya menyadari bahwa ini tidak menangani "mengapa" tetapi utas menarik banyak orang mencari solusi untuk masalah segera.
sumber
"\\"
(string non-mentah dengan backslash)Karena \ "diizinkan di dalam string mentah. Maka tidak dapat digunakan untuk mengidentifikasi akhir string literal.
Mengapa tidak berhenti mengurai string literal ketika Anda menemukan yang pertama "?
Jika itu masalahnya, maka \ "tidak akan diizinkan di dalam string literal. Tapi itu.
sumber
\"
mana saja dalam string mentah yang dikutip ganda, OR \ pada akhir string mentah yang dikutip ganda. Statistik penggunaan harus mendukung urutan dua karakter di mana saja vs. urutan satu karakter di akhir.Alasan mengapa
r'\'
sintaksis salah adalah bahwa meskipun ekspresi string adalah mentah, tanda kutip yang digunakan (tunggal atau ganda) selalu harus melarikan diri karena mereka akan menandai akhir dari kutipan sebaliknya. Jadi jika Anda ingin mengekspresikan kutipan tunggal di dalam string kutipan tunggal, tidak ada cara lain selain menggunakan\'
. Hal yang sama berlaku untuk tanda kutip ganda.Tapi Anda bisa menggunakan:
sumber
Pengguna lain yang sejak itu menghapus jawaban mereka (tidak yakin apakah mereka ingin dikreditkan) menyarankan bahwa perancang bahasa Python mungkin dapat menyederhanakan desain parser dengan menggunakan aturan parsing yang sama dan memperluas karakter yang melarikan diri ke bentuk mentah sebagai renungan. (jika literal ditandai sebagai mentah).
Saya pikir itu ide yang menarik dan saya memasukkannya sebagai komunitas wiki untuk anak cucu.
sumber
sumber
Datang dari C, cukup jelas bagi saya bahwa satu \ berfungsi sebagai karakter pelarian yang memungkinkan Anda untuk menempatkan karakter khusus seperti baris baru, tab, dan kutipan ke dalam string.
Itu memang melarang \ sebagai karakter terakhir karena ia akan lolos dari "dan membuat parser tersedak. Tetapi seperti yang ditunjukkan sebelumnya \ adalah legal.
sumber
beberapa tips:
1) jika Anda perlu memanipulasi backslash untuk path maka modul standar python os.path adalah teman Anda. sebagai contoh :
2) jika Anda ingin membangun string dengan garis miring terbalik di dalamnya TETAPI tanpa garis miring terbalik di akhir string Anda, maka string mentah adalah teman Anda (gunakan awalan 'r' sebelum string literal Anda). sebagai contoh :
3) jika Anda perlu awalan string dalam variabel X dengan backslash maka Anda dapat melakukan ini:
4) jika Anda perlu membuat string dengan garis miring terbalik di akhir kemudian gabungkan tip 2 dan 3:
sekarang lilypond_statement berisi
"\DisplayLilyMusic \upper"
python hidup panjang! :)
n3on
sumber
os.path.normpath
akan menghapus backslash tailing ... Lalu bagaimana saya harus menggabungkan nama file ke jalan ...Saya mengalami masalah ini dan menemukan solusi parsial yang baik untuk beberapa kasus. Meskipun python tidak dapat mengakhiri string dengan backslash tunggal, itu dapat diserialisasi dan disimpan dalam file teks dengan backslash tunggal di akhir. Karena itu jika yang Anda butuhkan adalah menyimpan teks dengan backslash tunggal di komputer Anda, itu mungkin:
BTW itu tidak bekerja dengan json jika Anda membuangnya menggunakan perpustakaan json python.
Akhirnya, saya bekerja dengan Spyder, dan saya perhatikan bahwa jika saya membuka variabel dalam editor teks spider dengan mengklik ganda namanya dalam variabel explorer, itu disajikan dengan backslash tunggal dan dapat disalin ke clipboard dengan cara itu (bukan sangat membantu untuk sebagian besar kebutuhan tetapi mungkin untuk beberapa ..).
sumber