Estou tentando encontrar cada série de 10 dígitos de números dentro de uma série maior de números usando re no Python 2.6.
Sou facilmente capaz de pegar nenhuma correspondência sobreposta, mas quero todas as correspondências da série numérica. Por exemplo.
em "123456789123456789"
Devo obter a seguinte lista:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Encontrei referências a um "lookahead", mas os exemplos que vi mostram apenas pares de números, em vez de agrupamentos maiores e não fui capaz de convertê-los além dos dois dígitos.
python
regex
overlapping
calças de ganga
fonte
fonte
(a|ab|abc)
podem geralmente ser reescritas como não sobrepostas com grupos de captura aninhados, por exemplo(a(b(c)?)?)?
, onde ignoramos todos, exceto o grupo de captura mais externo (ou seja, mais à esquerda) ao desempacotar uma correspondência; reconhecidamente isso é um pouco doloroso e menos legível. Essa também será uma regex de melhor desempenho para corresponder.Respostas:
Use um grupo de captura dentro de um lookahead. O lookahead captura o texto no qual você está interessado, mas a correspondência real é tecnicamente a substring de largura zero antes do lookahead, então as correspondências não são tecnicamente sobrepostas:
fonte
Você também pode tentar usar o módulo de terceiros
regex
(nãore
), que oferece suporte a correspondências sobrepostas.fonte
Gosto de regexes, mas elas não são necessárias aqui.
Simplesmente
resultado
fonte
0 <= i < len(s)-n+1
é garantidamente o início de uma correspondência de 10 dígitos. Também acho que seu código poderia ser acelerado, seria interessante codificar para velocidade.