2012-10-06 1 views
8

In Python 2.6. Es scheint, dass Markierungen am Ende der Zeichenfolge $ und \Z nicht mit Gruppenausdrücken kompatibel sind. Fo Beispiel

import re 
re.findall("\w+[\s$]", "green pears") 

kehrt

['green '] 

(so $ funktioniert 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 das so funktioniert und wie um zu gehen?

+1

'so $ effektiv nicht Werk' - Was ist Ihre erwartete Ausgabe ?? –

+0

@RohitJain '['grün', 'Birnen']' (wie von '\ w + \ s'' plus' '\ w + $' '). –

Antwort

22

Ein [..] Ausdruck ist eine Zeichengruppe, was bedeutet, dass ein beliebiges darin enthaltenes Zeichen übereinstimmt. Sie entsprechen somit einem Literal $ Zeichen. Eine Zeichengruppe gilt immer für ein Eingabezeichen und kann daher niemals einen Anker enthalten.

Wenn Sie entweder ein Leerzeichen oder das Ende der Zeichenfolge übereinstimmen wollten, verwenden Sie eine Nicht-Erfassungsgruppe statt, kombiniert mit dem | oder Selektor:

r"\w+(?:\s|$)" 

Alternativ sehen Sie die \b Wortgrenzenanker. Es passt überall dort, wo eine \w Gruppe beginnt oder endet (also verankert es sich an Stellen im Text, an denen ein \w Zeichen ein \W Zeichen vorausgeht oder folgt oder am Anfang oder Ende der Zeichenfolge steht).

+0

@EMS: Das ist, weil die ':' in meinem Gesichtsausdruck war ein Tippfehler; korrigiert. –

+0

... wegen meinem Tippfehler, sorry dafür. –

+0

Ich denke, du meinst eine ** nicht erfassende ** Gruppe. Dieses Zeug ist so verwirrend wie es ist; Lassen Sie uns zumindest versuchen, die Terminologie korrekt zu verwenden. –

3

Eckige Klammern keine Gruppe zeigen, geben sie einen Zeichensatz, der ein Charakter entspricht (eines von denen in den Klammern) Als documented „Sonderzeichen ihre besondere Bedeutung innerhalb Sätze verlieren“ (es sei denn, anders angegeben als mit Klassen wie \s).

Wenn Sie \s oder Ende der Zeichenfolge anpassen möchten, verwenden Sie etwas wie \s|$.

0

Die Antwort von Martijn Pieters ist korrekt. Um ein wenig zu erarbeiten, wenn Sie erfassen Gruppen verwenden

r"\w+(\s|$)" 

Sie erhalten:

>>> re.findall("\w+(\s|$)", "green pears") 
[' ', ''] 

Das ist, weil re.findall() die gefangenen Gruppe (\s|$) Werte zurückgibt.

Parentheses () are used for two purposes: Zeichengruppen und erfasste Gruppen. Um erfassten Gruppen zu deaktivieren, aber nach wie vor als Zeichengruppen handeln, verwenden (?:...) Syntax:

>>> re.findall("\w+(?:\s|$)", "green pears") 
['green ', 'pears'] 
Verwandte Themen