Python正则表达式找到所有重叠匹配?

dan*_*nts 77 python regex overlapping

我试图在Python 2.6中使用re在一系列更大的数字中找到每10个数字系列的数字.

我很容易就能抓住没有重叠的比赛,但我想要数字系列中的每场比赛.例如.

在"123456789123456789"

我应该得到以下列表:

[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Run Code Online (Sandbox Code Playgroud)

我发现了对"前瞻"的引用,但我看过的例子只显示了数字对而不是更大的分组,我无法将它们转换为超出两位数.

ber*_*nie 143

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

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]
Run Code Online (Sandbox Code Playgroud)

  • 说明=它不是搜索模式(10位数),而是搜索模式所遵循的任何内容.因此它找到字符串的位置0,字符串的位置1,依此类推.然后它抓取组(1) - 匹配模式并列出那些.很酷. (12认同)
  • 我加入了StackOverflow,回答了问题,并获得了我的声誉,所以我可以提出这个答案.我现在坚持使用Python 2.4所以我不能使用Python 3的更高级的正则表达式函数,这只是我正在寻找的那种奇怪的技巧. (9认同)
  • 我的答案至少比这个答案快2倍。但是我赞成这种解决方案是棘手的。 (2认同)
  • 您能否在代码中添加更多说明。按照堆栈溢出的方法,将代码包含在答案中并不是最好的方法。它肯定会帮助人们。 (2认同)

Dav*_*d C 70

您也可以尝试使用支持重叠匹配的第三方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
Run Code Online (Sandbox Code Playgroud)


eyq*_*uem 18

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

只是

s =  "123456789123456789"

n = 10
li = [ s[i:i+n] for i in xrange(len(s)-n+1) ]
print '\n'.join(li)
Run Code Online (Sandbox Code Playgroud)

结果

1234567891
2345678912
3456789123
4567891234
5678912345
6789123456
7891234567
8912345678
9123456789
Run Code Online (Sandbox Code Playgroud)

  • 仅在这里不需要正则表达式,因为您正在“在更大的数字序列中”应用特殊知识,因此您已经知道每个位置“ 0 <= i <len-s + 1”都可以作为起点。 10位数字的匹配。另外,我认为您的代码可能会加快速度,对于代码高尔夫球而言,这对于提高速度很有趣。 (3认同)

Mic*_*ael 5

借助已接受的答案,以下内容目前也有效

import re
s = "123456789123456789"
matches = re.findall(r'(?=(\d{10}))',s)
results = [int(match) for match in matches]
Run Code Online (Sandbox Code Playgroud)