正则表达式匹配多个正向先行组

Regular Expression to match multiple postive lookahead groups

这是我目前的正则表达式:

^(?=.*(option1|option2))(?=.*(option3|option4))(?=.*(option5|option6))(?=.*(option7|option8))(?=.*(option9|option10)).*$

我不熟悉正则表达式语言,所以我会做出自己的定义:

类别 1 是 (option1|option2),类别 2 是 (option3|option4),类别 3 是 (option5|option6),依此类推

我想捕获至少从 3 个或更多类别中找到 1 个选项的值,如下所示:

一些文字选项3更多文字选项8更多文字选项1

一些文字选项3更多文字选项8更多文字选项1更多文字选项6

我不想像这样捕获值:

一些文字选项3更多文字选项8 - 仅代表2个类别

一些文字选项3更多文字选项4更多文字选项1(选项3和4 个属于同一类别)

选项可以在文本中以任何顺序出现,所以这就是我使用正前瞻的原因,但我不知道如何在多个正前瞻上放置量词。

就正则表达式引擎而言,我必须在后台使用由 python 提供支持的前端 UI。我只能使用正则表达式,无法使用任何其他 python 函数。谢谢!

我不认为这可以用正则表达式实现,或者如果可以(可能在某些步骤中),这不是一个正确的方法。

相反,您可以将选项存储在一个集合中,例如:

options = {(option1, option2), (option3, option4), (option5, option6), (option7, option8), (option9, option10)}

然后像下面这样检查成员资格:

if sum(i in my_text or j in my_text for i, j in options) >= 3:
    # do something

这是一个演示:

>>> s1 = "some text option8 some more text option3 some more text option1"
>>> s2 = "some text option3 some more text option4 some more text option1"
>>> s3 = "some text option3 some more text option8"
>>> 
>>> options = {('option1', 'option2'), ('option3', 'option4'), ('option5', 'option6'), ('option7', 'option8'), ('option9', 'option10')}
>>> 
>>> sum(i in s1 or j in s1 for i, j in options)
3
>>> sum(i in s2 or j in s2 for i, j in options)
2
>>> sum(i in s3 or j in s3 for i, j in options)
2

这是一个可以满足您要求的正则表达式(在 VERBOSE 模式下):

^
(?= .* (?: option1 | option2 )  () )?
(?= .* (?: option3 | option4 )  () )?
(?= .* (?: option5 | option6 )  () )?
(?= .* (?: option7 | option8 )  () )?
(?= .* (?: option9 | option10 ) () )?
.*$
(?:  |  |  |  |  |
     |  |  |  |  )

空组用作复选框:如果封闭的前瞻不成功,对该组的反向引用将不会成功。最后的非捕获组包含五个反向引用中的三个的所有可能组合。

这种方法的局限性很明显;你只需要再添加一组 option 就可以完全失控了。我认为您最好使用非正则表达式解决方案。