如何使用正则表达式查找所有重叠的匹配

我试图使用 Python 2.6中的 re 来查找更大数列中的每个10位数字序列。

我可以很容易地抓住没有重叠的匹配,但我想在数字系列中的每一个匹配。

“123456789123456789”

我应该得到以下列表:

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

我发现了一些关于“向前看”的引用,但是我看到的例子只显示了一对数字,而没有显示更大的分组,我还没有能够将它们转换成两位数以外的数字。

87302 次浏览

在前瞻中使用捕获组。前瞻捕获您感兴趣的文本,但是实际的匹配在前瞻之前是零宽度子字符串,所以匹配在技术上是不重叠的:

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]

我喜欢正则表达式,但在这里不需要它们。

很简单

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

您还可以尝试使用支持重叠匹配的 第三方 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

借助已接受的答案,下面的方法目前也可以工作

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)