Python 三合一正则表达式
我有一个非常具体的正则表达式请求。我需要匹配字符串Python 三合一正则表达式,python,regex,regex-negation,regex-lookarounds,Python,Regex,Regex Negation,Regex Lookarounds,我有一个非常具体的正则表达式请求。我需要匹配字符串 包含“m_” 不包含“phys_”(总是在“m_”之后有一些字符) 不以“形状”结尾 当仅使用第一个和最后一个条件时,此正则表达式似乎工作正常: ^.*m_.*(?<!Shape)$ ^.*m.*? 但当我加入中间标准时,我就迷路了 import re r = re.compile(r'^(?=.*m_)(?!.*m_.+phys_)(?!.+Shape$)') print r.match("aaa") print r.match
- 包含“m_”
- 不包含“phys_”(总是在“m_”之后有一些字符)
- 不以“形状”结尾
^.*m_.*(?<!Shape)$
^.*m.*?
但当我加入中间标准时,我就迷路了
import re
r = re.compile(r'^(?=.*m_)(?!.*m_.+phys_)(?!.+Shape$)')
print r.match("aaa")
print r.match("aaa m_ xx")
print r.match("aaa m_ xx Shape")
print r.match("aaa m_ xx phys_ foo")
基本上,原则是:
^
(?= .* should be there)
(?! .* should not be there)
基本上,原则是:
^
(?= .* should be there)
(?! .* should not be there)
你想要的正则表达式是
^(?=.*m_)(?!.*phys_)(?!.*Shape$).*$
它将捕获整个字符串,每个条件都在它自己的前瞻中。您可以对其进行测试,并查看正在发生的情况的可视化视图。您想要的正则表达式是
^(?=.*m_)(?!.*phys_)(?!.*Shape$).*$
它将捕获整个字符串,每个条件都在它自己的前瞻中。您可以对它进行测试,并查看正在发生的事情的可视化效果。这可以通过Python中的普通字符串方法实现(为了清晰起见,我添加了括号):
我将(总是在“m_”之后的一些字符)解释为“phys_”从不出现在“m_”前面的提示,而不是允许“phys_”出现在“m_”前面的情况通过。这可以通过Python中的普通字符串方法实现(为了清楚起见,我添加了括号):
我将(总是在“m_”后面的一些字符)解释为“phys_”从不出现在“m_”前面的提示,而不是允许“phys_”出现在“m_”前面的情况要通过。正则表达式是用什么语言实现的?如果可以使用3个相当简单的正则表达式,为什么要在一个正则表达式中执行3个任务?@zzzzBov:Python。我在我的自制配置系统中也使用相同的正则表达式功能。(到目前为止,它的工作做得非常出色,因此不打算很快替换它。)让我保留这个问题。我认为当我们谈论regex时,编程语言并不是那么重要(在理想情况下:),为什么不用一个正则表达式来解决问题呢?比使用“3个相当简单的正则表达式”更优雅。是的,我们应该考虑更多,但为什么不:)@Kovge:Regex在模式不固定时很好。但是这三个条件都涉及到“包含”或“以”静态文本结尾,这可以通过正常的字符串处理函数来完成。如果egrep也是一个选项,您可以这样做:cat$filename | egrep-v'(phys | Shape$)'| grep'm |
正则表达式是用什么语言实现的?既然可以使用3个相当简单的正则表达式,为什么还要在一个正则表达式中执行3个任务?@zzbov:Python。在我的自制配置系统中,我对各种其他东西使用相同的正则表达式功能。(到目前为止,它的工作做得非常出色,因此不打算很快更换它。)让我保留这个问题。我认为当我们谈论regex(在理想情况下:)时,编程语言并不是那么重要,为什么不用一个regexp解决一个问题呢?比使用“3个相当简单的正则表达式”更优雅。是的,我们应该考虑更多,但为什么不:)@Kovge:Regex在模式不固定时是好的。但这三个条件都涉及“包含”或“以”静态文本结尾,这可以通过正常的字符串处理函数来完成。如果egrep也是一个选项,您可以这样做:cat$filename | egrep-v'(phys | Shape$)'| grep'm |
,恕我直言,这与我的答案有什么不同?如果条件为真,则要求问题匹配字符串。您的答案仅与空字符串匹配。您的正则表达式还处理phys_uu条件下的m_uu,这是多余的。@thg435:它更短,更切题,尽管您更快了!:)@乔纳斯比斯特罗姆:是的,看起来我误解了你的要求(“etc后面总是有一些字符”)。下次,请尽量说得更具体些!不,抱歉,*$
部分没有任何意义。恕我直言,这与我的回答有什么不同?如果条件为真,则要求问题与字符串匹配。您的答案仅与空字符串匹配。您的正则表达式还处理phys_uu条件下的m_uu,这是多余的。@thg435:它更短,更切题,尽管您更快了!:)@乔纳斯比斯特罗姆:是的,看起来我误解了你的要求(“etc后面总是有一些字符”)。下次,请尽量说得更具体些!不,抱歉,*$
部分没有任何意义。我想要一个正则表达式字符串,而不是python语句,因为它是配置文件的一部分。@JonasByström:下次提问时请将这一事实包括在内。在这种情况下,我认为正则表达式不是一个好的解决方案,但是如果该工具不允许任何其他选项,那么它会使您对正则表达式的请求成为一个有效的请求。我想要一个正则表达式字符串,而不是python语句,因为它是配置文件的一部分。@JonasByström:下次提问时请将这一事实包括在内。我认为在这种情况下,regex不是一个好的解决方案,但是如果该工具不允许任何其他选项,那么它会使您对regex的请求成为一个有效的请求。