Re modülündeki normal ifadeler kelime sınırlarını (\ b) destekliyor mu?


102

Normal ifadeler hakkında biraz daha fazla şey öğrenmeye çalışırken, bir öğretici, \bbir kelime sınırını eşleştirmek için ' yi kullanabileceğinizi önerdi . Ancak, Python yorumlayıcısındaki aşağıdaki kod parçası beklendiği gibi çalışmıyor:

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

Eşleşen bir şey varsa, bir eşleşme nesnesi olmalıydı, ama öyle None.

Is \bifadesi Python desteklenmeyen ya da ben yanlış kullanıyorum?


31
Bu işe yarayacak:re.search(r"\btwo\b", x)
Bolo

5
Neden "ham" dizeleri kullanmıyorsun? r"\btwo\b"?
S.Lott

3
İnsanlar vardır genellikle karıştı hakkında \b.
tchrist

Evet Python yapar, sadece ham dizeye ihtiyacınız vardır, r'\b'böylece karakter kaçmış olur. (ya da çifte kaçış \\b, ki bu iğrenç)
smci

Yanıtlar:


86

Neden denemiyorsun

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

Çıktı:

>>> 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>

Ayrıca bahsetmeyi unuttum , kodunuzda ham dizeler kullanıyor olmalısınız

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

İlginç, çalışma örneği için teşekkürler. Seçtiğim yöntemin neden işe yaramadığına dair herhangi bir fikriniz var mı? Yaklaşımınızda yalnızca bir kez derlemeniz dışında, iki yaklaşım aynı olmalıdır.
DC

1
@darren: Yaptıklarınızı iyileştiren son örneğime bakın. Aramak için ham dizeler sağladım.
pyfunc

1
ahh senin ve Bolo'nun önerisinden sonra, ham bir ip kullanmadığım içindi. Teşekkürler!
DC

9
-1: Geriye doğru. Ham dizeler önce olmalıdır. Dizgi %ikamesi ile bir yeniden ifade oluşturmanın diğer işi, bu özel soruyla ilgisiz, kötü bir tanjanttır.
S.Lott

2
Kötü cevap. Kod çalışıyor, ancak herhangi bir açıklaması yok.
Aran-Fey

89

Bu çalışacak: re.search(r"\btwo\b", x)

Eğer yazarken "\b"Python, tek karakterdir: "\x08". Ters eğik çizgiden şu şekilde kaçının:

"\\b"

veya şöyle bir ham dizge yazın:

r"\b"

4
Bu bana gerçekten yardımcı oldu ... Normal ifadeye benzeyen bir pyspark ile mücadele ediyordum ve \ b (kelime sınırı) 'nın neden çalışmadığını anlayamadım. Teşekkürler
jb1t

18

Neden re.search("\btwo\b", x) işe yaramadığını açık bir şekilde açıklamak için , bunun nedeni \bbir Python dizesinde bir geri alma karakterinin kısaltması olmasıdır.

print("foo\bbar")
fobar

Dolayısıyla, desen "\btwo\b"bir backspace arıyor two, ardından başka bir backspace takip ediyor , aradığınız dizge ( x = 'one two three') içermiyor.

Diziyi bir kelime sınırı olarak yorumlamaya re.search(veya compile) izin vermek için \b, ters eğik çizgilerden ( "\\btwo\\b") kaçının veya deseninizi ( r"\btwo\b") oluşturmak için ham bir dize kullanın .


10

Python belgeleri

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

\ b

Boş dizeyle eşleşir, ancak yalnızca bir kelimenin başında veya sonunda. Sözcük, alfasayısal veya alt çizgi karakterleri dizisi olarak tanımlanır, bu nedenle bir sözcüğün sonu boşluk veya alfanümerik olmayan, alt çizgi olmayan bir karakterle gösterilir. Resmi olarak \ b'nin bir \ w ve a \ W karakterleri (veya tersi) veya \ w ile dizenin başlangıcı / sonu arasındaki sınır olarak tanımlandığına dikkat edin, bu nedenle alfanümerik olarak kabul edilen tam karakter kümesi UNICODE ve LOCALE bayraklarının değerlerinde. Örneğin, r '\ bfoo \ b', 'foo', 'foo.', '(Foo)', 'bar foo baz' ile eşleşir ancak 'foobar' veya 'foo3' ile eşleşmez. Bir karakter aralığı içinde \ b, Python'un dizgi değişmez değerleri ile uyumluluk için geri boşluk karakterini temsil eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.