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

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的请求成为一个有效的请求。