J'essaie de trouver toutes les séries de nombres à 10 chiffres dans une plus grande série de nombres en utilisant re dans Python 2.6.
Je suis facilement capable de ne saisir aucune correspondance qui se chevauche, mais je veux chaque correspondance de la série numérique. Par exemple.
dans "123456789123456789"
Je devrais obtenir la liste suivante:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
J'ai trouvé des références à un "lookahead", mais les exemples que j'ai vus ne montrent que des paires de nombres plutôt que des groupements plus grands et je n'ai pas été en mesure de les convertir au-delà des deux chiffres.
python
regex
overlapping
danspants
la source
la source
(a|ab|abc)
peuvent généralement être réécrites comme des expressions régulières qui ne se chevauchent pas avec des groupes de capture imbriqués, par exemple(a(b(c)?)?)?
, où nous ignorons tout sauf le groupe de capture le plus à l'extérieur (c'est-à-dire le plus à gauche) lors du déballage d'une correspondance; c'est certes un peu douloureux et moins lisible. Ce sera également une regex plus performante pour correspondre.Réponses:
Utilisez un groupe de capture dans une anticipation. La recherche anticipée capture le texte qui vous intéresse, mais la correspondance réelle est techniquement la sous-chaîne de largeur zéro avant la recherche anticipée, donc les correspondances ne se chevauchent pas techniquement:
la source
Vous pouvez également essayer d'utiliser le module tiers
regex
(nonre
), qui prend en charge les correspondances qui se chevauchent.la source
J'adore les expressions régulières, mais elles ne sont pas nécessaires ici.
Simplement
résultat
la source
0 <= i < len(s)-n+1
est garantie pour être le début d'une correspondance à 10 chiffres. Aussi je pense que votre code pourrait être accéléré, ce serait intéressant de coder le golf pour la vitesse.