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?


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

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"

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").


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.