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

165 投票
4 回答
108855 浏览
提问于 2025-04-16 15:28

我想在一串更长的数字中找到每一个10位数的数字序列,使用的是Python 2.6中的正则表达式(re)。

我可以很容易地找到不重叠的匹配项,但我想要在这串数字中找到每一个匹配项。例如:

在“123456789123456789”中

我应该得到以下列表:

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

我看到有人提到过“前瞻”(lookahead),但我看到的例子只显示了数字对,而不是更大的组合,我还没有办法把它们转换成超过两位数的匹配。

4 个回答

14

我很喜欢正则表达式,但在这里用不上。

简单来说

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
108

你也可以试试使用这个第三方的 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
273

在前瞻中使用捕获组。前瞻会捕捉你感兴趣的文本,但实际上匹配的部分是在前瞻之前的一个零宽度的子串,所以这些匹配在技术上是不会重叠的:

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]

撰写回答