Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Regex Lookarounds - Fatal编程技术网

Python 用于匹配多个正向前瞻组的正则表达式

Python 用于匹配多个正向前瞻组的正则表达式,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,这是我到目前为止的正则表达式: ^(?=.*(option1|option2))(?=.*(option3|option4))(?=.*(option5|option6))(?=.*(option7|option8))(?=.*(option9|option10)).*$ 我不熟悉正则表达式语言,因此我将自己定义: 第一类是(选项1 |选项2),第二类是(选项3 |选项4),第三类是(选项5 |选项6),等等 我希望捕获至少从3个或更多类别中找到1个选项的值,如下所示: 一些文本选项3一些更多

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

^(?=.*(option1|option2))(?=.*(option3|option4))(?=.*(option5|option6))(?=.*(option7|option8))(?=.*(option9|option10)).*$
我不熟悉正则表达式语言,因此我将自己定义:

第一类是(选项1 |选项2),第二类是(选项3 |选项4),第三类是(选项5 |选项6),等等

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

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

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

我不想捕捉这样的值:

一些文本选项3一些更多文本选项8-仅表示两个类别

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

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


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

我认为这不能用regex实现,或者如果是(可能在某些步骤中),这不是一个合适的方法

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

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
模式下):

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


这种方法的局限性是显而易见的;您只需再添加一组
选项
s,它就可以完全失控。我认为您最好使用非正则表达式解决方案。

感谢您提供此解决方案!你能再解释一下什么是详细模式吗?我必须使用的前端UI不允许更改为详细模式。这可以在python的默认模式下编写吗(不确定该模式的名称)?您可以通过在正则表达式的开头添加
(?x)
来指定详细模式。或者你可以从regex中删除所有的空白。或者你可以从regex中删除所有的空白:<代码:<代码:<代码::<代码::<代码::<代码:<代码:<代码:::<代码:::<代码::::<代码:::<代码:::::::::::::::::::::::::::::选项3;选项4(4)选项4)选项4()()()())你可以:::::(((::::::::::::::::::::::::::::::::::::::::::::::::::::::;选项3;选项3;选项4;选项4;选项4;选项4;选项4)选项4(4)选项4)选项4(4)选项4)选项4()()()()()()()()()()()()()()()()()()();\2\3\5 |\2\4\5 |\3\4\5)
^
(?= .* (?: 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 )