“不匹配”的正则表达式语法?

Posted

技术标签:

【中文标题】“不匹配”的正则表达式语法?【英文标题】:Regular expression syntax for "match nothing"? 【发布时间】:2010-10-30 18:16:40 【问题描述】:

我有一个大量使用正则表达式的 python 模板引擎。它使用如下连接:

re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )

我可以修改各个子字符串(regexp1、regexp2 等)。

是否有任何不匹配的小而轻的表达式,我可以在我不想要任何匹配的模板中使用它?不幸的是,有时 '+' 或 '*' 会附加到正则表达式原子,所以我不能使用空字符串 - 这会引发“没有重复”错误。

【问题讨论】:

***.com/questions/1723182/… 标题是否可以更好地表述为“正则表达式无法匹配任何内容”?不匹配意味着成功匹配空字符串。 【参考方案1】:

要匹配一个空字符串——即使在多行模式下——你也可以使用\A\Z,所以:

re.compile('\A\Z|\A\Z*|\A\Z+')

区别在于\A\Z字符串的开始和结束,而^$可以匹配的开始/结束>,因此$^|$^*|$^+ 可能会匹配包含换行符的字符串(如果启用了该标志)。

如果无法匹配任何内容(即使是空字符串),只需尝试在字符串开头之前查找内容,例如:

re.compile('.\A|.\A*|.\A+')

由于 \A 之前不能有任何字符(根据定义),这将始终无法匹配。

【讨论】:

你的看起来比我的好,因为我认为它会比使用行尾退出更快。 彼得,你使用 \z(小写),而我的 Python 袖珍指南告诉我字符串结尾断言是 \Z(大写)?! ThomasH,它们都是字符串的结尾,但大写版本允许尾随换行符,而小写版本不允许。 嗯,有趣的是,我发现这没有任何记录。此外, re.search("boo\z", "fooboo") 不返回匹配对象,而 re.search("boo\Z", "fooboo) i> 可以。相反,re.search("boo\z", "foobooz") 匹配,这说明 '\z' 被简单地解释为 'z',对吧?! (这是在 Python 2.6 中)。 抱歉,我以为 Python 是 PCRE,但事实证明有一些不同,这就是其中之一。 (请参阅regular-expressions.info/refflavors.html 上的“锚点”)【参考方案2】:

(?!) 应该始终无法匹配。它是零宽度负前瞻。如果括号中的内容匹配,则整个匹配失败。鉴于它里面什么都没有,它会匹配任何东西(包括什么都没有)。

【讨论】:

对,我也正要发这个。如果您的语言支持前瞻,这是最好的方法。同样 (?=) 匹配每个字符串。【参考方案3】:

或者,使用一些列表解析来删除无用的正则表达式条目并加入以将它们放在一起。比如:

re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))

请务必在该行代码旁边添加一些 cmets :-)

【讨论】:

【参考方案4】:

你可以使用\z.. 这是字符串的绝对结尾,后面是任意两个

如果+* 被添加到最后,这仍然可以拒绝匹配任何内容

【讨论】:

为什么要两个? IIRC \z 不允许尾随换行符,不像 \Z,所以一个就够了吗?或者这是对* 的一种奇怪的防御(你为什么要提防这个?) 这感觉是我的 rust 实现的最佳解决方案,它不支持我最初喜欢的负面展望。由于我不理解 .\A|.\A*|.\A+ 实际上匹配任何字符串的原因。【参考方案5】:

这不应该匹配任何东西:

re.compile('$^')

因此,如果您将 regexp1、regexp2 和 regexp3 替换为 '$^',将无法找到匹配项。除非您使用的是多行模式。


经过一些测试,我找到了更好的解决方案

re.compile('a^')

无法匹配,并且会比之前的解决方案更早失败。您可以将 a 替换为任何其他字符,并且始终无法匹配

【讨论】:

那肯定不会匹配任何东西,并且对于正则表达式引擎来说是轻量级的处理? (不希望我的存根正则表达式吃掉很多 CPU) @地狱之眼。它应该是轻量级的。这将尝试匹配行结束,然后是行开始。这在一行中是不可能的。 但当然可以使用多行(取决于是否启用了标志) - 对于无论是否启用标志都有效的解决方案,请参阅我的答案。 正则表达式“$^”匹配空字符串,至少在某些实现中是这样。第二个更好。 @romkyns 第二个与我对 PyQt4 QtCore.QRegExp 的调用中的空字符串不匹配。太糟糕了,因为执行起来肯定会更轻松。【参考方案6】:

也许'.0'

【讨论】:

以上是关于“不匹配”的正则表达式语法?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式简单语法以及常用正则表达式

正则表达式简单语法

正则表达式语法手册,以及一些实例

Python 中正则表达式全部语法速查

javascript 正则表达式语法和API知识点整理

正则表达式基础知识