0

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

  • 包含“m_”,
  • 包含“phys_”(总是在“m_”之后的一些字符),
  • 以“形状”结尾。

当只使用第一个和最后一个标准时,这个正则表达式似乎工作正常:

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

但是当我添加中间标准时,我迷失了。

4

3 回答 3

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)
于 2013-04-11T22:11:34.217 回答
1

你想要的正则表达式是

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

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

于 2013-04-11T22:20:57.730 回答
0

这可以通过 Python 中的普通字符串方法来实现(为了清楚起见,我添加了括号):

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

我将(总是在“m_”之后的一些字符)解释为“phys_”永远不会出现在“m_”前面的提示,而不是允许“phys_”出现在“m_”前面的情况通过。

于 2013-04-11T22:46:47.790 回答