2010-11-07 22 views
5

Vorrei estrarre il designatore e le operazioni dalla stringa designator: op1 op2, in cui potrebbero essere presenti 0 o più operazioni e sono consentiti più spazi. Ho usato la seguente espressione regolare in PythonEspressione regolare Python

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

Il problema è che solo des1 e op2 è trovato nei gruppi di corrispondenza, OP1 non è. Qualcuno sa perché?

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

risposta

4

entrambi sono "trovati", ma solo uno può essere "catturato" dal gruppo. se è necessario acquisire più di un gruppo, è necessario utilizzare la funzionalità di espressione regolare più volte. Si potrebbe fare qualcosa di simile, prima riscrivendo l'espressione principale:

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

allora avete bisogno di estrarre i singoli sottosezioni:

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

qual è la differenza con regex di OP? – SilentGhost

+0

scusa l'ho inviato per errore prima di finire il post. – SingleNegationElimination

+0

ah, nessun fastidio. ma se vai con due regex, non sarebbe più efficiente usare solo i metodi stringa? – SilentGhost

4

io non vedo proprio il motivo per cui avresti bisogno regex, è abbastanza semplice da analizzare con metodi delle stringhe:

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

Non ho pensato che split() potesse essere usato per dividere componenti separati da più spazi. Credo che funzioni anche questo. Grazie! – Jeff

0

farei sth come questo:

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