Em uma expressão regular do Python, encontro esse problema singular. Você poderia dar instruções sobre as diferenças entre re.findall('(ab|cd)', string)
e 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)
A saída real é:
['ab', 'cd']
['cd']
Estou confuso sobre por que o segundo resultado não contém 'ab'
também?
Respostas:
+
é um quantificador de repetição que corresponde uma ou mais vezes. Na regex(ab|cd)+
, você está repetindo o grupo de captura(ab|cd)
usando +. Isso capturará apenas a última iteração.Você pode argumentar sobre esse comportamento da seguinte maneira:
Digamos que sua string é
abcdla
e regex é(ab|cd)+
. O mecanismo Regex encontrará uma correspondência para o grupo entre as posições 0 e 1ab
e sai do grupo de captura. Em seguida, ele vê o+
quantificador e tenta capturar o grupo novamente e capturacd
entre as posições 2 e 3.Se você deseja capturar todas as iterações, deve capturar o grupo de repetição em vez de
((ab|cd)+)
quais correspondênciasabcd
ecd
. Você pode fazer o grupo interno não capturar, pois não nos importamos com correspondências de grupos internos com((?:ab|cd)+)
quais correspondênciasabcd
https://www.regular-expressions.info/captureall.html
No Documentos,
fonte
'(?:ab|cd)+'
vai funcionar.Não sei se isso vai esclarecer mais as coisas, mas vamos tentar imaginar o que acontece sob o capô de uma maneira simples, vamos resumir o que acontece usando match
findall
corresponder e consumir a string ao mesmo tempo, vamos imaginar o que acontece com este REGEX'(ab|cd)'
:Agora a mesma coisa com
'(ab|cd)+'
Espero que isso esclareça um pouco.
fonte
Então, para mim, parte confusa foi o fato de que
docs
portanto, não está retornando uma correspondência completa, mas apenas uma captura. Se você fizer esse grupo não capturar
(re.findall('(?:ab|cd)+', string)
, ele retornará["abcd"]
como eu esperava inicialmentefonte