Em expressões regulares, a correspondência gananciosa refere-se à correspondência do maior número possível de caracteres, enquanto a correspondência não gananciosa (também chamada de correspondência lenta ou correspondência mínima) corresponde ao menor número de caracteres possível.
As expressões regulares são gananciosas por padrão, o que corresponde ao maior número possível de caracteres. Por exemplo, considere o seguinte exemplo:
import re
text = "Hello, my name is John. Nice to meet you, John."
pattern = r'my.*John' # 贪婪匹配
match = re.search(pattern, text)
print(match.group())
Saída:
my name is John. Nice to meet you, John
Neste exemplo, a expressão regular my.*John
corresponde a qualquer caractere após “meu” (incluindo espaços, sinais de pontuação, etc.) até o último “João”.
Se quisermos combinar a menor string depois de "my", ou seja, parar de combinar quando encontrarmos o primeiro "John", podemos usar símbolos de correspondência não gananciosos e ?
mudar .*
para .*?
, como segue:
import re
text = "Hello, my name is John. Nice to meet you, John."
pattern = r'my.*?John' # 非贪婪匹配
match = re.search(pattern, text)
print(match.group())
Saída:
my name is John
Desta vez, a expressão regular my.*?John
usa correspondência não gananciosa, que corresponde apenas à menor string “meu nome é John” antes do primeiro “John” que atende à condição. Ao usar a correspondência não gananciosa, podemos controlar a expressão regular para corresponder ao menor número possível de caracteres, resultando em resultados mais precisos.