2013-04-11 77 views
0

我有一个非常具体的正则表达式请求。我需要匹配的字符串三合一正则表达式

  • 含有 “M_”
  • 含有 “phys_”(在 “M_” 总有一些字符),
  • 在 “形” 的结局。

当仅使用正则表达式这似乎很好地工作在第一和最后一个标准:

^.*m_.*(?<!Shape)$ 

但是,当我说我失去了中间标准。

+2

正则表达式实现了什么语言?你为什么试图在一个正则表达式中执行三个任务,当你可以使用3个相当简单的正则表达式? – zzzzBov 2013-04-11 22:03:58

+0

@zzzzBov:Python。在我的自制配置系统中,我也使用相同的正则表达式功能来处理各种其他事情。 (在这一点之前,它的工作非常出色,所以不要马上更换它。) – 2013-04-11 22:06:48

+1

让我保存这个问题。 当我们谈论正则表达式(在理想情况下)时,我认为编程语言并不那么重要,为什么不用一个正则表达式解决问题呢?比使用'3合理简单的正则表达式'更优雅。是的,我们应该考虑更多,但为什么不:) :) – Kovge 2013-04-11 22:09:41

回答

1

你想要的正则表达式是

^(?=.*m_)(?!.*phys_)(?!.*Shape$).*$ 

它将捕获整个字符串,每个条件是在它自己的前瞻。您可以测试它并查看www.debuggex.com上正在发生的事情的可视化。

+1

尽我所能,这与我的回答有什么不同? – georg 2013-04-11 22:43:18

+1

如果条件为真,则要求匹配字符串的问题。您的答案只匹配空字符串。你的正则表达式也在物理条件中处理m_,这是多余的。 – 2013-04-11 23:08:47

+0

@ thg435:虽然速度更快,但它更短,更重要! :) – 2013-04-12 06:48:09

2
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) 
0

这可以用在Python正常的字符串的方法来实现(我加括号内为清晰起见):

("m_" in input) and ("phys_" not in input) and (not input.endswith("Shape")) 

我解释(总有一些字符后,“M_”)作为一个暗示,“phys_”永不出现在“m_”的前面,而不是允许“phys_”出现在“m_”前面的情况通过。

+0

我想要一个正则表达式字符串,而不是python语句,因为它是配置文件的一部分。 – 2013-04-12 06:24:12

+0

@JonasByström:下次将这个事实包含在你的问题中。在这种情况下,我认为正则表达式不是一个好的解决方案,但是如果该工具不允许任何其他选项,那么它会使您对正则表达式的请求成为有效的请求。 – nhahtdh 2013-04-12 12:55:01