En una expresión regular de Python, me encuentro con este problema singular. ¿Podría dar instrucciones sobre las diferencias entre re.findall('(ab|cd)', string)
y re.findall('(ab|cd)+', string)
?
import re
string = 'abcdla'
result = re.findall('(ab|cd)', string)
result2 = re.findall('(ab|cd)+', string)
print(result)
print(result2)
La salida real es:
['ab', 'cd']
['cd']
Estoy confundido en cuanto a por qué el segundo resultado no contiene 'ab'
también?
Respuestas:
+
es un cuantificador de repetición que coincide una o más veces. En la expresión regular(ab|cd)+
, está repitiendo el grupo de captura(ab|cd)
con +. Esto solo capturará la última iteración.Puede razonar sobre este comportamiento de la siguiente manera:
Digamos que su cadena es
abcdla
y regex es(ab|cd)+
. El motor Regex encontrará una coincidencia para el grupo entre las posiciones 0 y 1 a medida queab
sale del grupo de captura. Luego ve el+
cuantificador e intenta capturar el grupo nuevamente y capturarácd
entre las posiciones 2 y 3.Si desea capturar todas las iteraciones, debe capturar el grupo repetitivo con el
((ab|cd)+)
que coincideabcd
ycd
. Puede hacer que el grupo interno no se capture ya que no nos interesan las coincidencias de grupo interno con las((?:ab|cd)+)
que coincideabcd
https://www.regular-expressions.info/captureall.html
De los documentos,
fuente
'(?:ab|cd)+'
funcionará.No sé si esto aclarará más las cosas, pero tratemos de imaginar lo que sucede debajo del capó de una manera simple, vamos a resumir lo que sucede usando el partido
findall
unir y consumir la cadena al mismo tiempo, imaginemos qué sucede con este REGEX'(ab|cd)'
:Ahora lo mismo con
'(ab|cd)+'
Espero que esto aclare un poco las cosas.
fuente
Entonces, para mí una parte confusa fue el hecho de que
docs
por lo que te devuelve no una coincidencia completa sino solo una captura. Si hace que este grupo no se capture
(re.findall('(?:ab|cd)+', string)
, volverá["abcd"]
como esperaba inicialmentefuente