In Python 2.6. Es scheint, dass Markierungen am Ende der Zeichenfolge $
und \Z
nicht mit Gruppenausdrücken kompatibel sind. Zum Beispiel
import re
re.findall("\w+[\s$]", "green pears")
Kehrt zurück
['green ']
($
funktioniert also effektiv nicht). Und mit
re.findall("\w+[\s\Z]", "green pears")
Führt zu einem Fehler:
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in findall(pattern, string, flags)
175
176 Empty matches are included in the result."""
--> 177 return _compile(pattern, flags).findall(string)
178
179 if sys.hexversion >= 0x02020000:
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in _compile(*key)
243 p = sre_compile.compile(pattern, flags)
244 except error, v:
--> 245 raise error, v # invalid expression
246 if len(_cache) >= _MAXCACHE:
247 _cache.clear()
error: internal: unsupported set operator
Warum funktioniert das so und wie geht man herum?
3 Antworten
Ein [..]
Ausdruck ist eine Zeichengruppe , was bedeutet, dass er mit einem darin enthaltenen Zeichen übereinstimmt. Sie stimmen also mit einem Literalzeichen $
überein. Eine Zeichengruppe gilt immer für ein Eingabezeichen und kann daher niemals einen Anker enthalten.
Wenn Sie entweder einem Leerzeichen oder dem Ende der Zeichenfolge entsprechen möchten, verwenden Sie stattdessen eine nicht erfassende Gruppe in Kombination mit |
oder Selektor:
r"\w+(?:\s|$)"
Alternativ können Sie sich den Wortgrenzenanker \b
ansehen. Es stimmt überall dort überein, wo eine \w
Gruppe beginnt oder endet (es verankert sich also an Punkten im Text, an denen einem \w
Zeichen ein \W
Zeichen vorangestellt oder gefolgt ist oder sich am Anfang befindet oder Ende der Zeichenfolge).
Eckige Klammern geben keine Gruppe an, sondern einen Zeichensatz, der mit einem Zeichen (einem der Zeichen in Klammern) übereinstimmt. Als dokumentiert," Sonderzeichen verlieren ihre besondere Bedeutung innerhalb von Mengen "(sofern nicht anders angegeben als bei Klassen wie \s
) .
Wenn Sie mit \s
oder dem Ende der Zeichenfolge übereinstimmen möchten, verwenden Sie etwas wie \s|$
.
Die Antwort von Martijn Pieters ist richtig. Um es etwas näher zu erläutern, wenn Sie Erfassungsgruppen verwenden
r"\w+(\s|$)"
Du erhältst:
>>> re.findall("\w+(\s|$)", "green pears")
[' ', '']
Dies liegt daran, dass re.findall()
die erfassten Gruppenwerte (\s|$)
zurückgibt.
Klammern ()
werden für zwei Zwecke verwendet: Zeichengruppen und erfasste Gruppen. Verwenden Sie die (?:...)
-Syntax, um erfasste Gruppen zu deaktivieren, aber dennoch als Zeichengruppen zu fungieren:
>>> re.findall("\w+(?:\s|$)", "green pears")
['green ', 'pears']
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.