2017-04-14 1 views
2

Ich benutze derzeit Python 2.7 (Ich arbeite mit einigen alten Code von mir). Und ich versuche, alle Wörter über Regex zu bekommen, wo ich Wörter mit Apostrophen wie can't und Gary's ignorieren kann. Bisher habe ich alle Buchstaben im String in Kleinbuchstaben gemacht und hier ist meine aktuelle Regex:Suche alle Wörter: Negative Blick hinter in Regex

r"(?<=\s|^)([a-z]+)(?=\s|$)" 

bekomme ich folgende Fehlermeldung:

raise error, v # invalid expression

error: look-behind requires fixed-width pattern

ich auch versucht:

r"(?:\s|^)([a-z]+)(?=\s|$)" 

Aber, Wie Sie auf Regex101 sehen können, erfasst es nicht das letzte Wort.

Ich weiß, dass es wahrscheinlich bessere Alternativen dazu gibt, aber jetzt bin ich wirklich neugierig, wie ich in dieser Situation einen negativen Blick hinterlasse. Wenn Sie das jedoch erklären und Ihre eigene bessere Lösung anbieten könnten, wäre das in Ordnung und geschätzt.

Antwort

2

In diesem Fall verwenden Sie nur eine negative Lookbehind mit der anderen Zeichenklasse \S (gleiche kann mit dem Look-Ahead erfolgen):

r"(?<!\S)([a-z]+)(?!\S)" 

die regex demo See.

Es wird ein "positiver" -Ansatz weniger hübsch aussehen:

r"(?:(?<=\s)|^)([a-z]+)(?=\s|$)" 

Siehe another regex demo. Die nicht erfassende Gruppe (?:(?<=\s)|^) kombiniert zwei assertionsfreie Alternativen mit der Breite (?<=\s), die vor dem aktuellen Speicherort ein Leerzeichen und ^ erfordern, die mit dem Anfang der Zeichenfolge übereinstimmen.

+0

Gibt es trotzdem kein Negativ? Ich bin neugierig, falls ich in der Zukunft ein ähnliches Problem haben sollte. – Neil

+0

Ja, aber es sieht nicht ordentlich aus. –

+0

Wenn es nicht zu viel verlangt ist, könntest du das auch zufällig posten? – Neil

Verwandte Themen