正则表达式匹配多个正面前瞻组

时间:2016-08-03 00:49:29

标签: python regex regex-lookarounds

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

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

我对正则表达式语言不熟悉所以我会自己定义:

类别1是(option1 | option2),类别2是(option3 | option4),类别3是(option5 | option6)等。

我想捕获三个或更多类别中至少有一个选项的值,如下所示:

一些文字选项3 更多文字 option8 更多文字 option1

OR

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

我不想捕捉这样的值:

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

OR

某些文字选项3 更多文字选项4 更多文字选项1 (选项3和4来自同一类别)

选项可以在文本中以任何顺序出现,这就是为什么我使用正向前瞻,但我不知道如何将量词放在多个正向前瞻。

就正则表达式引擎而言,我必须在后台使用由python驱动的前端UI。我只能使用正则表达式,我没有能力使用任何其他python函数。谢谢!

2 个答案:

答案 0 :(得分:1)

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

相反,您可以将选项存储在以下集合中:

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

答案 1 :(得分:1)

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

^
(?= .* (?: option1 | option2 )  () )?
(?= .* (?: option3 | option4 )  () )?
(?= .* (?: option5 | option6 )  () )?
(?= .* (?: option7 | option8 )  () )?
(?= .* (?: option9 | option10 ) () )?
.*$
(?: \1\2\3 | \1\2\4 | \1\2\5 | \1\3\4 | \1\3\5 |
    \1\4\5 | \2\3\4 | \2\3\5 | \2\4\5 | \3\4\5 )

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

这种方法的局限性是显而易见的;你需要再添加一组option来完全失控。我认为使用非正则表达式解决方案会更好。