2010-11-07 16 views
5

Me gustaría extraer el designador y las operaciones de la cadena designator: op1 op2, en la que podría haber 0 o más operaciones y se permiten múltiples espacios. He utilizado la siguiente expresión regular en PythonExpresión regular de Python

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

los problemas es que sólo DES1 y op2 se encuentran en los grupos a juego, op1 no lo es. ¿Alguien sabe por qué?

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

Respuesta

4

ambos son 'encontrados', pero solo uno puede ser 'capturado' por el grupo. si necesita capturar más de un grupo, entonces necesita usar la funcionalidad de expresión regular varias veces. Se podría hacer algo como esto, en primer lugar por la reescritura de la expresión principal:

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

entonces usted necesita para extraer las subsecciones individuales:

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

¿cuál es la diferencia con la expresión regular de OP? – SilentGhost

+0

lo siento enviado de forma accidental antes de terminar la publicación. – SingleNegationElimination

+0

ah, no te molestes. pero si vas con dos expresiones regulares, ¿no sería más eficiente simplemente usar métodos de cadena? – SilentGhost

4

Realmente no veo por qué se necesitaría expresiones regulares, es bastante simple para analizar con los métodos de cadena:

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

No consideré que split() podría usarse para dividir componentes separados por múltiples espacios. Yo creo que esto también funciona. ¡Gracias! – Jeff

0

me gustaría hacer algo como esto:

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