Python regex trouver toutes les correspondances se chevauchant?
j'essaie de trouver toutes les séries de nombres à 10 chiffres dans une plus grande série de nombres en utilisant re en python 2.6.
je suis facilement capable de saisir aucun match se chevauchant, mais je veux chaque match dans la série de nombres. 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 vu ne montrent que des paires de nombres plutôt que des groupes plus grands et je n'ai pas été en mesure de les convertir au-delà des deux chiffres.
3 réponses
utilisez un groupe de capture à l'intérieur d'un lookahead. La lookahead capture le texte qui vous intéresse, mais la correspondance réelle est techniquement la sous-couche de largeur zéro avant la lookahead, de sorte que les correspondances sont techniquement sans chevauchement:
import re
s = "123456789123456789"
matches = re.finditer(r'(?=(\d{10}))',s)
results = [int(match.group(1)) for match in matches]
# results:
# [1234567891,
# 2345678912,
# 3456789123,
# 4567891234,
# 5678912345,
# 6789123456,
# 7891234567,
# 8912345678,
# 9123456789]
vous pouvez également essayer d'utiliser le tiers regex
module (pas re
), qui supporte les correspondances se chevauchant.
>>> import regex as re
>>> s = "123456789123456789"
>>> matches = re.findall(r'\d{10}', s, overlapped=True)
>>> for match in matches: print match
...
1234567891
2345678912
3456789123
4567891234
5678912345
6789123456
7891234567
8912345678
9123456789
j'aime les regexes, mais ils ne sont pas nécessaires ici.
simplement
s = "123456789123456789"
n = 10
li = [ s[i:i+n] for i in xrange(len(s)-n+1) ]
print '\n'.join(li)
résultat
1234567891
2345678912
3456789123
4567891234
5678912345
6789123456
7891234567
8912345678
9123456789