2009-05-24 23 views
5

En la expresión regular de python, los grupos con nombre y sin nombre se definen con '(' y ')'. Esto lleva a un comportamiento extraño. Regexppython, expresiones regulares, grupos con nombre y operador "lógico o"

"(?P<a>1)=(?P<b>2)" 

utiliza con el texto "1 = 2" encontrará grupo llamado "a" con el valor "1" y el llamado grupo "b" con el valor "2". Pero si quiero usar "lógico o" operador y concatenar varias reglas, la siguiente expresión regular:

"((?P<a>1)=(?P<b>2))|(?P<c>3)" 

se utiliza con un mismo texto "1 = 2" se encuentra un grupo no identificado con el valor "1 = 2" . Entendí que el motor de expresiones regulares trata "(" y ")" que incluye los grupos "a" y "b" como un grupo sin nombre e informa que se encuentra. Pero no quiero que se denuncie un grupo sin nombre, solo quiero usar "|" para "pegar" varias expresiones regulares juntas. Sin crear ningún grupo parásito sin nombre. ¿Es una forma de hacerlo en Python?

Respuesta

13

Uso (?:) para deshacerse del grupo sin nombre:

r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)" 

De la documentación de re:

(:? ...) Una versión no Agrupación de paréntesis regulares. Coincide con la expresión regular dentro del paréntesis , pero la subcadena que coincide con por el grupo no se puede recuperar después de realizando una coincidencia o haciendo referencia más adelante en el patrón.

Por cierto, el operador alternancia | tiene muy baja prioridad con el fin de hacer paréntesis innecesarios en casos como el suyo. Puede soltar los paréntesis adicionales en su expresión regular y continuará funcionando como se esperaba:

r"(?P<a>1)=(?P<b>2)|(?P<c>3)" 
+0

Muchas gracias, que funciona como un encanto^_ ^ – grigoryvp

Cuestiones relacionadas