DeprecationWarning: escape sequence tidak valid - apa yang harus digunakan selain \ d?

106

Saya telah menemui masalah dengan remodul di Python 3.6.5. Saya memiliki pola ini dalam ekspresi reguler saya:

'\\nRevision: (\d+)\\n'

Tetapi ketika saya menjalankannya, saya mendapatkan file DeprecationWarning.

Saya mencari masalahnya di SO , dan belum menemukan jawabannya, sebenarnya - apa yang harus saya gunakan \d+? Hanya [0-9]+atau mungkin sesuatu yang lain?

mchfrnc.dll
sumber
2
Seharusnya tidak menjadi masalah, berikan lebih banyak kode?
Sraw
3
Pelarian ganda \datau gunakan r'\\nRevision: (\d+)\\n'?
revo

Jawaban:

176

Python 3 mengartikan literal string sebagai string Unicode, dan oleh karena itu Anda \ddiperlakukan sebagai karakter Unicode yang lolos.

Deklarasikan pola RegEx Anda sebagai string mentah sebagai gantinya dengan melakukan prapengiriman r, seperti di bawah ini:

r'\nRevision: (\d+)\n'

Ini juga berarti Anda dapat melepaskan escapes \njuga karena ini hanya akan diurai sebagai karakter baris baru oleh re.

ACascarino
sumber
8
Untuk lebih tepatnya, \ddiperlakukan sebagai urutan pelolosan yang tidak dikenali dan dibiarkan tidak berubah. DeprecationWarning diberikan sejak Python 3.6. Di beberapa versi Python yang akan datang, ini akan menjadi SyntaxError. Detail dari "2.4.1. String dan Bytes literals" di Dokumen.
VPfB
@VPfB utasnya sudah tua, tetapi saya sedang mencari jawaban untuk masalah yang sama. Jika \ d diperlakukan sebagai karakter Unicode yang lolos, bagaimana cara membedakan d (karakter alfabet) dari \ d (digit apa pun) tanpa memperlakukan pola ekspresi reguler sebagai string mentah? (Pertanyaan yang sama berlaku untuk \ w, \ W dll ...)
giulia_dnt
2
@theggg Jika saya memahami pertanyaan Anda dengan benar - hilangkan garis miring terbalik Anda, sehingga string akan terbaca '\\d'.
ACascarino