Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式是否找到所有重叠的匹配项?_Python_Regex_Overlapping - Fatal编程技术网

Python正则表达式是否找到所有重叠的匹配项?

Python正则表达式是否找到所有重叠的匹配项?,python,regex,overlapping,Python,Regex,Overlapping,我试图在Python2.6中使用re在更大的数字序列中查找每一个10位数的数字序列 我很容易抓到没有重叠的匹配,但我想要数字系列中的每一个匹配。例如 在“123456789123456789”中 我应该得到以下列表: [1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789] 我发现了对“前瞻”的引用,但我看到的示例只显示了成对的数字,而不是更大的分组,

我试图在Python2.6中使用re在更大的数字序列中查找每一个10位数的数字序列

我很容易抓到没有重叠的匹配,但我想要数字系列中的每一个匹配。例如

在“123456789123456789”中

我应该得到以下列表:

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

我发现了对“前瞻”的引用,但我看到的示例只显示了成对的数字,而不是更大的分组,我无法将它们转换为两位数以外的数字。

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

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]

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

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

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

简单地

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

您还可以尝试使用(而不是
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

您还可以尝试使用(而不是
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


当重叠匹配从同一点开始时,所提供的解决方案将不起作用,例如,将“a | ab | abc”与“abcd”匹配将只返回一个结果。有没有一种解决方案不需要多次调用match(),手动跟踪“结束”边界?@VítorDeAraújo:像
(a | ab | abc)
这样的重叠正则表达式通常可以被重写为具有嵌套捕获组的非重叠正则表达式,例如
(a(b(c)?)
,在这里我们忽略了最外层的正则表达式解包匹配时(即最左边的)捕获组;诚然,这有点痛苦,不太清晰。这也是一个更适合匹配的正则表达式。当重叠匹配从同一点开始时,所提供的解决方案将不起作用,例如,将“a | ab | abc”与“abcd”匹配将只返回一个结果。是否有一种解决方案不涉及多次调用match(),手动跟踪“结束”边界?@VítorDeAraújo:重叠正则表达式,如
(a | ab | abc)
通常可以重写为具有嵌套捕获组的非重叠正则表达式,例如
(a(b(c)?)?
,我们忽略除最外层(即最左侧)以外的所有内容解包匹配时捕获组;无可否认,这有点痛苦,不太清晰。这也是一个性能更高的正则表达式匹配。我的答案至少比这个快2倍。但这个解决方案很棘手,我投票支持它。解释=而不是搜索模式(10位),它搜索模式后面的任何内容。因此它找到字符串的位置0,字符串的位置1,依此类推。然后它抓取组(1)-匹配模式并列出它们。非常酷。我加入了StackOverflow,回答了一些问题,提高了我的声誉,这样我就可以对这个答案进行投票。我现在只能使用Python 2.4,所以我不能使用Python 3更高级的正则表达式函数,这正是我一直在寻找的一种奇怪的诡计。你能添加更多的解释吗对代码的剖析。根据堆栈溢出,这不是最好的方法,只在答案中包含代码。这肯定会帮助人们。这真的很有帮助。谢谢:DMy答案比这个答案至少快2倍。但是这个解决方案很棘手,我投了赞成票。解释=而不是搜索模式(10位),它搜索模式后面的任何内容。因此它找到字符串的位置0,字符串的位置1,依此类推。然后它抓取组(1)-匹配模式并列出它们。非常酷。我加入了StackOverflow,回答了一些问题,提高了我的声誉,这样我就可以对这个答案进行投票。我现在只能使用Python 2.4,所以我不能使用Python 3更高级的正则表达式函数,这正是我一直在寻找的一种奇怪的诡计。你能添加更多的解释吗对代码的剖析。根据堆栈溢出的情况,这不是最好的方法,只是在答案中包含代码。这肯定会帮助人们。这真的很有帮助。谢谢:这里不需要Dregex,因为您正在“在更大的数字系列中”应用特殊知识,因此您已经知道这里不需要每个位置
0正则表达式,因为您正在应用“在更大的数字系列中”的特殊知识,因此您已经知道我得到的每个位置
0:
TypeError:findall()得到一个意外的关键字参数“重叠”
@Carsten:您首先需要安装有效的
regex
模块:
pip install regex
,谢谢。如果没有安装regex,我会认为我会得到一个导入错误。I get:
TypeError:findall()得到一个意外的关键字参数“重叠”
@Carsten:您首先需要安装有效的
regex
模块:
pip install regex
,谢谢。如果没有安装regex,我本以为会出现导入错误