Вопрос-Ответ

How to use regex to find all overlapping matches

Как использовать регулярное выражение для поиска всех перекрывающихся совпадений

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

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

в "123456789123456789"

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

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

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

Переведено автоматически
Ответ 1

Используйте группу захвата внутри 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]
Ответ 2

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

>>> import regex as re
>>> s = "123456789123456789"
>>> matches = re.findall(r'\d{10}', s, overlapped=True)
>>> for match in matches: print(match) # print match
...
1234567891
2345678912
3456789123
4567891234
5678912345
6789123456
7891234567
8912345678
9123456789
Ответ 3

Мне нравятся регулярные выражения, но здесь они не нужны.

Просто

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
Ответ 4

В дополнение к принятому ответу, в настоящее время также работает следующее

import re
s = "123456789123456789"
matches = re.findall(r'(?=(\d{10}))',s)
results = [int(match) for match in matches]
python regex