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?

15
Piotr Migdal 7 Okt. 2012 im 00:25

3 Antworten

Beste Antwort

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

29
Martijn Pieters 7 Okt. 2012 im 07:48

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

3
BrenBarn 6 Okt. 2012 im 20:30

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']
1
Community 23 Mai 2017 im 11:47