Apakah ekspresi reguler dari modul re mendukung batasan kata (\ b)?

100

Saat mencoba mempelajari lebih banyak tentang ekspresi reguler, tutorial menyarankan agar Anda dapat menggunakan \buntuk mencocokkan batas kata. Namun, cuplikan penafsir Python berikut tidak berfungsi seperti yang diharapkan:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

Seharusnya itu adalah objek yang cocok jika ada yang cocok, tetapi memang demikian None.

Apakah \bekspresi tidak didukung dalam Python atau saya salah menggunakannya?

DC
sumber
31
Ini akan berhasil:re.search(r"\btwo\b", x)
Bolo
5
Mengapa Anda tidak menggunakan string "mentah"? r"\btwo\b"?
S. Lott
3
Orang-orang sering bingung tentang \b.
tchrist
Ya, Python melakukannya, Anda hanya perlu string mentah r'\b'agar karakternya lolos. (atau double-escape itu \\b, yukky)
smci

Jawaban:

85

Mengapa Anda tidak mencoba

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

Keluaran:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

Juga lupa menyebutkan, Anda harus menggunakan string mentah dalam kode Anda

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 
pyfunc
sumber
Menarik, terima kasih atas contoh kerjanya. Apakah Anda memiliki pemahaman tentang mengapa metode yang saya pilih tidak berhasil? Kedua pendekatan tersebut harus sama, kecuali bahwa dalam pendekatan Anda, Anda hanya mengompilasi sekali.
DC
1
@ Darren: Lihat contoh terakhir saya yang meningkatkan apa yang Anda lakukan. Saya menyediakan string mentah untuk dicari.
pyfunc
1
ahh setelah saranmu dan Bolo, itu karena aku tidak menggunakan benang mentah. Terima kasih!
DC
9
-1: Mundur. String mentah harus menjadi yang pertama. Urusan lain membangun ekspresi ulang dengan %substitusi string adalah tangen yang buruk, tidak relevan dengan pertanyaan khusus ini.
S. Lott
2
Jawaban yang buruk. Kode berfungsi, tetapi tidak ada penjelasan apa pun.
Aran-Fey
88

Ini akan berhasil: re.search(r"\btwo\b", x)

Ketika Anda menulis "\b"di Python, itu adalah karakter tunggal: "\x08". Keluar dari garis miring terbalik seperti ini:

"\\b"

atau tulis string mentah seperti ini:

r"\b"
Bolo
sumber
4
Ini sangat membantu saya ... Saya berjuang dengan ekspresi reguler seperti pyspark dan tidak tahu mengapa \ b (batas kata) tidak berfungsi. Terima kasih
jb1t
17

Hanya untuk menjelaskan secara eksplisit mengapa re.search("\btwo\b", x) tidak berhasil, itu karena \bdalam string Python adalah singkatan dari karakter spasi mundur.

print("foo\bbar")
fobar

Jadi pola "\btwo\b"mencari backspace, diikuti oleh two, diikuti oleh backspace lain, yang tidak dimiliki string yang Anda cari ( x = 'one two three').

Untuk mengizinkan re.search(atau compile) menafsirkan urutan \bsebagai batas kata, lepas dari garis miring terbalik ( "\\btwo\\b") atau gunakan string mentah untuk membuat pola Anda ( r"\btwo\b").

Bill the Lizard
sumber
10

Dokumentasi Python

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ b

Cocok dengan string kosong, tetapi hanya di awal atau akhir kata. Sebuah kata didefinisikan sebagai urutan karakter alfanumerik atau garis bawah, sehingga akhir kata ditunjukkan dengan spasi atau karakter non-alfanumerik, non-garis bawah. Perhatikan bahwa secara formal, \ b didefinisikan sebagai batas antara karakter \ w dan \ W (atau sebaliknya), atau antara \ w dan awal / akhir string, sehingga set karakter yang dianggap alfanumerik bergantung pada nilai-nilai bendera UNICODE dan LOCALE. Misalnya, r '\ bfoo \ b' cocok dengan 'foo', 'foo.', '(Foo)', 'bar foo baz' tetapi tidak dengan 'foobar' atau 'foo3'. Di dalam rentang karakter, \ b mewakili karakter spasi mundur, untuk kompatibilitas dengan literal string Python.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber