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.

55
demandé sur C8H10N4O2 2011-04-11 08:41:50

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]
107
répondu bernie 2018-08-06 22:27:55

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
56
répondu David C 2018-08-06 22:28:52

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
16
répondu eyquem 2011-07-27 13:34:12