【问题标题】:Creating a single regex rather than a nested statement创建单个正则表达式而不是嵌套语句
【发布时间】:2015-09-16 06:37:15
【问题描述】:

我想做以下匹配:

如果MBzz 在字符串中则匹配,但如果[Rr][Ee][Ff] 在字符串中则不匹配

所以以下应该匹配:

  • klasdlkMBzzsdld
  • MBzz

以下内容不应匹配:

  • RefmmmmMBzzmmmmm
  • MBzzmmmmmmREFmmmm

等等

现在,我正在做这个可怕的 hack:

def mySearch(val):
    if (re.compile('MBab').search(val) is not None) and \
       (re.compile('[Rr][Ee][Ff]').search(val) is None):
        return re.compile('MBab').search(val).group()
    return None

但是,我觉得对于这么简单的事情,我作为一个班轮应该能够完成。

【问题讨论】:

  • 由于某种原因,我的电脑自动更正了 regex 到 reggae

标签: python regex python-2.7


【解决方案1】:

您可以使用以下带有修饰符 i 的正则表达式来忽略大小写:

^(?:(?!ref).)*(?=MBzz)(?:(?!ref).)*$

Demo

regex=re.compile(r'^[^ref]*(?=MBzz)[^ref]*$',re.I|re.MULTILINE)

(?=MBzz) 后面的正面外观将确保您的正则表达式引擎您的字符串包含MBzz,而(?:(?!ref).)* 后面的负面外观将匹配除ref 之外的任何内容。

如果您想考虑MBzz 的情况,您可以使用以下正则表达式而不忽略大小写修饰符:

^(?:(?![rR][eE][fF]).)*(?=MBzz)(?:(?![rR][eE][fF]).)*$

【讨论】:

  • 感谢您的回答。它几乎正是我想要的,除了我确实想要匹配MBzz 的情况。但是背后的正面和负面的看法看起来很有趣。我一定会看看他们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多