2009-06-15 17 views
2

Ich habe einige Probleme mit Python geben mir ein Ergebnis, das ich nicht erwarte. Hier ist ein Beispielcode:Python regulärer Ausdruck mit [: numeric:]

number = re.search(" [0-9] ", "test test2 test_ 2 333") 
print number.groups() 

number = re.search(" [[:digit:]] ", "test test2 test_ 2 333") 
print number.groups() 

Im ersten Block bekomme ich ein Objekt zurückgegeben, aber mit nichts drin. Wo ich denke, sollte ich die Zeichenfolge "2" bekommen.

Im zweiten Block bekomme ich nicht einmal ein Objekt, wo ich die Zeichenfolge "2" erwarte.

Während, wenn ich das in bash alles sieht gut aus:

echo "test test2 test_ 2 333" | grep " [[:digit:]] " 
echo "test test2 test_ 2 333" | grep " [0-9] " 

Kann mir jemand bitte helfen?

Antwort

3

die Gruppen() Methode gibt die Einfang-Gruppen. Es tut nicht Rückkehr Gruppe 0, falls das ist, was Sie erwartet haben. Verwenden Sie parens, um Erfassungsgruppen anzugeben. Beispiel:

>>> number = re.search(" ([0-9]) ", "test test2 test_ 2 333") 
>>> print number.groups() 
('2',) 

Als zweites Beispiel erkennt Pythons re-Modul die Syntax "[: digit:]" nicht. Verwenden Sie \d. zB:

>>> number = re.search(r" (\d) ", "test test2 test_ 2 333") 
>>> print number.groups() 
('2',) 
1

Ist das wonach Sie suchen?

>>> re.findall(r'([0-9])', "test test2 test_ 2 333") 
['2', '2', '3', '3', '3'] 
+0

Das funktioniert perfekt. Und während ich wartete, arbeitete ich weiter daran und entdeckte "re.finditer", was auch gut funktionierte. Übrigens habe ich gerade festgestellt, dass POSIX-Zeichenklassen von Python nicht unterstützt werden. – jdcaron

+0

Froh, dass du den Rest ausgerechnet hast! Die anderen Antworten sind viel umfassender. (Ich wurde unerwartet weggezogen und bekam keine Gelegenheit, etwas näher auszuführen.) – bernie

+0

In der Tat, ich möchte Sie bitten, die Antwort von Laurence Gonsalves zu akzeptieren (falls das überhaupt möglich ist): http: // stackoverflow. com/questions/994178/Python-Regular-Expression-mit-numerischen/994218 # 994218 – bernie

2

Sie vermissen die(), die den Inhalt für die Verwendung mit den Gruppen() (und anderen) Funktion (en) erfassen.

number = re.search(" ([0-9]) ", "test test2 test_ 2 333") 
print number.groups() 

Dies wird jedoch nicht funktionieren, weil Python die nicht unterstützt [[: Nummer:]] Notation

number = re.search(" ([[:digit:]]) ", "test test2 test_ 2 333") 
print number.groups() 
1
number = re.search(" [0-9] ", "test test2 test_ 2 333") 
print number.group(0) 

Gruppen() liefert nur Gruppen 1 und bis (ein wenig seltsam wenn du an andere Sprachen gewöhnt bist).

0

.groups() gibt Werte in übereinstimmenden Klammern zurück. Diese Regex hat keine durch parens definierten Bereiche, so dass Gruppen nichts zurückgeben. Sie wollen:

m = re.search ("([0-9])", "test test2 test_ 2 333") m.groups() ('2',)

+0

@adam: große Antwort! Tipp: Versuchen Sie, Ihren Code hervorzuheben und drücken Sie Strg-k, um Ihren Code korrekt zu formatieren, mit Syntax-Highlighting. – bernie