Python REGEX-匹配列表项,后跟另一个列表项';n';时代

Python REGEX-匹配列表项,后跟另一个列表项';n';时代,python,regex,Python,Regex,假设我们有一份清单 search\u list=[1,2,3,4,5,6] 我们想匹配这个列表中的任何项目,它在下面的字符串中跟在另一个项目后面n次 example string=此字符串中有一个、两个、三个和五个、六个 我们如何构建一个能够找到彼此相邻的所有项的正则表达式 在这种情况下,使用re.findall搜索时,输出应为 [('one', 'two', 'three'), ('five', 'six')] 这是我到目前为止试过的 将列表转换为可搜索字符串: chain_regex =

假设我们有一份清单

search\u list=[1,2,3,4,5,6]

我们想匹配这个列表中的任何项目,它在下面的字符串中跟在另一个项目后面n次

example string=此字符串中有一个、两个、三个和五个、六个

我们如何构建一个能够找到彼此相邻的所有项的正则表达式

在这种情况下,使用re.findall搜索时,输出应为

[('one', 'two', 'three'), ('five', 'six')]
这是我到目前为止试过的

将列表转换为可搜索字符串:

chain_regex = [re.escape(i) for i in search_list]
chain_regex = '|'.join(chain_re)
re.findall(f'({chain_regex})\s*({chain_regex})', example_string)
这可以很好地工作并产生以下输出:

[('one', 'two'), ('five', 'six')]
假设我想这样做n次。您将如何重新构造此查询,使其可以重复,而不必像下面那样无限期地链接它:

re.findall(f'({chain_regex})\s*({chain_regex})\s*({chain_regex})*\s*({chain_regex})*', example_string) etc....
编辑

re.findall(f'({chain_re})(\s*({chain_re}))+', example_string)
生成以下不完全正确的输出

[('one', ' three', 'three'), ('five', ' six', 'six')]

将越来越多的项目链接在一起确实有效,但是我不能总是确定需要将其链接在一起多少次-这就是我遇到的问题

您可以使用简单的正则表达式来完成此操作,但您必须过滤结果:

import re

test1 = "This string has one two three and also five six in it"
reg = re.compile(r"(((one|two|three|four|five|six).?)*)")
match = re.findall(reg, test)
filtered = [m[0] for m in match if len(m[0].split(" ")) > 1]
filtered = [list(filter(None, f.split(' '))) for f in filtered]
filtered #[['one', 'two', 'three'], ['five', 'six']]

示例:(已更新)

解决方案很好,但失败fr
此字符串中有一个、两个、三个、一个和五个、六个
,因此应定义两个组,而不是3@temmo他的示例返回了两个匹配项,
123一两
566
。如果您希望它不返回带有前导空格的组,只需将其设置为非捕获组:
(?:(一、二、三、四、五、六))+
谢谢Jacek,我已经对问题进行了一些更新,以便更好地描述我想要的结果。使用前瞻只能捕获输出为
[('one','two'),('two','two'),('five','six')]的2个元素。我正在寻找要返回的'n'元素。在
示例_string
中,我们从列表中有3个元素在字符串中彼此相邻,后面在字符串中有另外2个元素在一起,但如果这有意义,我们可以同样有15个元素彼此相邻?正如我所说,更新后,您必须对结果进行一些后处理,以获得唯一值列表,警告:有一个问题我以前没有教过,下一场比赛的第一个元素可能与上一场比赛的最后一个元素完全相同,我正在处理它,在您的示例中,
一二三
五六
不相邻。
一一二一
也是一对吗?@Chriz-谢谢你回答这个问题。为了清晰起见,我对它进行了一些更新并添加了一个编辑。是的,在这种情况下,1-2-1将匹配,因为它包含列表中的2个元素,彼此相邻4次。