Регулярное выражение Python находит все совпадающие совпадения?
Я пытаюсь найти каждые 10-значные серии чисел в большей серии чисел, используя re в Python 2.6.
Я легко могу схватить не совпадающие матчи, но я хочу каждый матч в серии чисел. Например.
в "123456789123456789"
Я должен получить следующий список:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Я нашел ссылки на "lookahead", но в примерах, которые я видел, показаны только пары чисел, а не большие группы, и я не смог преобразовать их за две цифры.
5 ответов
Используйте группу захвата в предвкушении. Заголовок захватывает интересующий вас текст, но фактическое совпадение - это технически подстрока нулевой ширины перед заглядыванием, поэтому совпадения технически не перекрываются:
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
Совмещая принятый ответ, в настоящее время также работает следующее
import re
s = "123456789123456789"
matches = re.findall(r'(?=(\d{10}))',s)
results = [int(match) for match in matches]
обычный способ:
import re
S = '123456789123456789'
result = []
while len(S):
m = re.search(r'\d{10}', S)
if m:
result.append(int(m.group()))
S = S[m.start() + 1:]
else:
break
print(result)