Я пытаюсь найти каждую 10-значную серию чисел в более крупной серии чисел, используя re в Python 2.6.
Я легко могу найти совпадающие совпадения, но мне нужно каждое совпадение в числовой серии. Например.
в "123456789123456789"
У меня должен получиться следующий список:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Я нашел ссылки на «опережающий просмотр», но в примерах, которые я видел, показаны только пары чисел, а не более крупные группы, и я не смог преобразовать их за пределы двух цифр.
python
regex
overlapping
брюки
источник
источник
(a|ab|abc)
обычно могут быть переписаны как неперекрывающиеся с вложенными группами захвата, например(a(b(c)?)?)?
, где мы игнорируем все, кроме самой внешней (то есть самой левой) группы захвата при распаковке совпадения; по общему признанию, это немного болезненно и менее разборчиво. Это также будет более производительное регулярное выражение для соответствия.Ответы:
Используйте группу захвата внутри просмотра вперед. Предварительный просмотр захватывает интересующий вас текст, но фактическое совпадение технически представляет собой подстроку нулевой ширины перед просмотром вперед, поэтому совпадения технически не перекрываются:
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) # print match ... 1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789
источник
TypeError: findall() got an unexpected keyword argument 'overlapped'
regex
модуль:pip install regex
Я люблю регулярные выражения, но они здесь не нужны.
Просто
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
источник
0 <= i < len(s)-n+1
гарантированно будет началом 10-значного совпадения. Также я полагаю, что ваш код можно было бы ускорить, было бы интересно использовать код-гольф для скорости.