web-dev-qa-db-fra.com

Python regex trouver toutes les correspondances qui se chevauchent?

J'essaie de trouver chaque série de 10 chiffres dans une plus grande série de nombres en utilisant re dans Python 2.6.

Je suis facilement capable de saisir aucune correspondance qui se chevauche, mais je veux que chaque correspondance de 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 à une "anticipation", mais les exemples que j'ai vus ne montrent que des paires de nombres plutôt que des regroupements plus importants et je n'ai pas pu les convertir au-delà des deux chiffres.

69
danspants

Utilisez un groupe de capture dans une tête de lecture. Le lookahead capture le texte qui vous intéresse, mais la correspondance réelle est techniquement la sous-chaîne de largeur nulle avant le lookahead, donc les correspondances ne se chevauchent pas techniquement:

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]
137
bernie

Vous pouvez également essayer d'utiliser le module module tiers regex (pas re), qui prend en charge les correspondances qui se chevauchent.

>>> 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
68
David C

J'adore les regex, mais elles 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
17
eyquem