2010-11-07 24 views
5

Ich möchte den Bezeichner und die Ops aus der Zeichenfolge designator: op1 op2 extrahieren, in der 0 oder mehr Ops und mehrere Leerzeichen zulässig sind. Ich benutzte den folgenden regulären Ausdruck in PythonPython Regulärer Ausdruck

import re 
match = re.match(r"^(\w+):(\s+(\w+))*", "des1: op1 op2") 

Die Probleme ist, dass nur des1 und op2 in den passenden Gruppen gefunden, op1 ist es nicht. Weiß jemand warum?

 
The groups from above code is 
Group 0: des1: op1 op2 
Group 1: des1 
Group 2: op2 
Group 3: op2 

Antwort

4

beide sind "gefunden", aber nur einer kann von der Gruppe "erfasst" werden. Wenn Sie mehr als eine Gruppe erfassen müssen, müssen Sie die Funktion für reguläre Ausdrücke mehrmals verwenden. Man könnte so etwas tun, zuerst durch den Haupt Ausdruck umschreiben:

match = re.match(r"^(\w+):(.*)", "des1: op1 op2") 

dann müssen Sie die einzelnen Teilabschnitte extrahieren:

ops = re.split(r"\s+", match.groups()[1])[1:] 
+0

Was ist der Unterschied zu OP Regex? – SilentGhost

+0

Entschuldigung, ich habe versehentlich vor der Fertigstellung der Post eingereicht. – SingleNegationElimination

+0

ah, keine Mühe. Aber wenn Sie mit zwei Regexes arbeiten, wäre es nicht effizienter, nur String-Methoden zu verwenden? – SilentGhost

4

Ich sehe nicht wirklich, warum Sie regex brauchen würde, es ist ganz einfach mit String-Methoden zu analysieren:

>>> des, _, ops = 'des1: op1 op2'.partition(':') 
>>> ops 
' op1 op2' 
>>> ops.split() 
['op1', 'op2'] 
+0

Ich dachte nicht, dass split() verwendet werden könnte, um Komponenten mit mehreren Leerzeichen getrennt zu teilen. Ich glaube, das funktioniert auch. Vielen Dank! – Jeff

0

ich etw wie dies tun würde:

>>> import re 
>>> tokenize = re.compile(flags=re.VERBOSE, pattern=""" 
...  (?P<de> \w+ (?=:)) | 
...  (?P<op> \w+) 
... """).finditer 
... 
>>> 
>>> for each in tokenize("des1: op1 op2"): 
...  print each.lastgroup, ':', each.group() 
... 
de : des1 
op : op1 
op : op2