Регулярное выражение Python находит все перекрывающиеся совпадения?


Я пытаюсь найти каждую 10-значную серию чисел в большей серии чисел, используя re в Python 2.6.

Я легко могу захватить не перекрывающиеся матчи, но я хочу, чтобы каждый матч в серии чисел. Например.

в "123456789123456789"

Я должен получить следующий список:

[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]

Я нашел ссылки на" lookahead", но примеры, которые я видел, показывают только пары чисел, а не большие группы, и я не был возможность конвертировать их за пределами двух цифр.

3 55

3 ответа:

используйте группу захвата внутри lookahead. Lookahead захватывает текст, который вас интересует, но фактическое совпадение технически является подстрокой нулевой ширины перед lookahead, поэтому совпадения технически не перекрываются:

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]

вы также можете попробовать использовать третьих лиц regex модуль (не re), который поддерживает перекрывающиеся матчей.

>>> 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

Я люблю регулярные выражения, но они не нужны здесь.

просто

s =  "123456789123456789"

n = 10
li = [ s[i:i+n] for i in xrange(len(s)-n+1) ]
print '\n'.join(li)

результат

1234567891
2345678912
3456789123
4567891234
5678912345
6789123456
7891234567
8912345678
9123456789