Unterstützen reguläre Ausdrücke aus dem Modul re Wortgrenzen (\ b)?

100

Während Sie versuchen, etwas mehr über reguläre Ausdrücke zu erfahren, wurde in einem Lernprogramm vorgeschlagen, dass Sie das verwenden können \b, um eine Wortgrenze abzugleichen. Das folgende Snippet im Python-Interpreter funktioniert jedoch nicht wie erwartet:

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

Es hätte ein Übereinstimmungsobjekt sein sollen, wenn etwas übereinstimmte, aber es ist None.

Wird der \bAusdruck in Python nicht unterstützt oder verwende ich ihn falsch?

DC
quelle
31
Dies wird funktionieren:re.search(r"\btwo\b", x)
Bolo
5
Warum verwenden Sie keine "rohen" Zeichenfolgen? r"\btwo\b"?
S.Lott
3
Die Menschen sind oft verwirrt über \b.
Tchrist
Ja, Python, Sie benötigen nur eine Rohzeichenfolge, r'\b'damit das Zeichen maskiert wird. (oder es doppelt entkommen \\b, was yukky ist)
smci

Antworten:

85

Warum versuchst du es nicht?

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

Ausgabe:

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

Auch vergessen zu erwähnen, sollten Sie rohe Zeichenfolgen in Ihrem Code verwenden

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 
pyfunc
quelle
Interessant, danke für das Arbeitsbeispiel. Haben Sie einen Einblick, warum die von mir gewählte Methode nicht funktioniert? Die beiden Ansätze sollten identisch sein, außer dass Sie in Ihrem Ansatz nur einmal kompilieren.
DC
1
@darren: Siehe mein letztes Beispiel, das nur das verbessert, was du getan hast. Ich habe rohe Zeichenfolgen für die Suche bereitgestellt.
Pyfunc
1
ahh nach deinem und Bolos Vorschlag, weil ich keine rohe Schnur verwendet habe. Vielen Dank!
DC
9
-1: Rückwärts. Die rohen Saiten sollten zuerst sein. Das andere Geschäft, einen Ausdruck mit String- %Substitution zu erstellen, ist eine schlechte Tangente, die für diese spezielle Frage irrelevant ist.
S.Lott
2
Falsche Antwort. Der Code funktioniert, aber es gibt keinerlei Erklärung.
Aran-Fey
88

Das wird funktionieren: re.search(r"\btwo\b", x)

Wenn Sie "\b"in Python schreiben , handelt es sich um ein einzelnes Zeichen : "\x08". Entkomme dem Backslash wie folgt:

"\\b"

oder schreiben Sie eine rohe Zeichenfolge wie folgt:

r"\b"
Bolo
quelle
4
Das hat mir wirklich geholfen ... Ich hatte Probleme mit einem pysparkähnlichen regulären Ausdruck und konnte nicht herausfinden, warum die \ b (Wortgrenze) nicht funktionierte. Danke
jb1t
17

Nur um explizit zu erklären, warum re.search("\btwo\b", x) dies nicht funktioniert, liegt es daran, dass \beine Python-Zeichenfolge eine Abkürzung für ein Rücktastezeichen ist.

print("foo\bbar")
fobar

Das Muster "\btwo\b"sucht also nach einer Rücktaste, gefolgt von einer twoweiteren Rücktaste, die die Zeichenfolge, in der Sie suchen ( x = 'one two three'), nicht hat.

Um zuzulassen re.search(oder compile), die Sequenz \bals Wortgrenze zu interpretieren , maskieren Sie entweder die Backslashes ( "\\btwo\\b") oder verwenden Sie eine rohe Zeichenfolge, um Ihr Muster zu erstellen ( r"\btwo\b").

Bill die Eidechse
quelle
10

Python-Dokumentation

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

\ b

Entspricht der leeren Zeichenfolge, jedoch nur am Anfang oder Ende eines Wortes. Ein Wort ist definiert als eine Folge von alphanumerischen Zeichen oder Unterstrichen. Das Ende eines Wortes wird also durch Leerzeichen oder ein nicht alphanumerisches Zeichen ohne Unterstrich angezeigt. Beachten Sie, dass \ b formal als die Grenze zwischen einem \ w- und einem \ W-Zeichen (oder umgekehrt) oder zwischen \ w und dem Anfang / Ende der Zeichenfolge definiert ist, sodass der genaue Satz von Zeichen, die als alphanumerisch gelten, abhängt auf die Werte der UNICODE- und LOCALE-Flags. Zum Beispiel entspricht r '\ bfoo \ b' 'foo', 'foo.', '(Foo)', 'bar foo baz', aber nicht 'foobar' oder 'foo3'. Innerhalb eines Zeichenbereichs steht \ b für die Rücktaste, um die Kompatibilität mit Pythons String-Literalen zu gewährleisten.

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