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


82

我有一个大量使用regexp的python模板引擎。它使用如下连接:

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

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

是否有任何轻巧的表达式什么都不匹配,我可以在不需要任何匹配的模板中使用它?不幸的是,有时将'+'或'*'附加到regexp原子上,所以我不能使用空字符串-这将引发“无可重复”的错误。



3
标题是否可以用“正则表达式无法匹配任何内容”更好地措词?不匹配将意味着成功匹配空字符串。
BamaPookie

Answers:


122

这不应该匹配任何东西:

re.compile('$^')

因此,如果用'$ ^'替换regexp1,regexp2和regexp3,将不可能找到匹配项。除非您使用多行模式。


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

re.compile('a^')

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


那肯定不会匹配任何东西,并且对于正则表达式引擎来说是轻量级的吗?(不希望我的存根正则
表达式

@地狱的眼睛。它应该是轻量级的。这将尝试匹配行尾,然后匹配行首。在一行中这是不可能的。
Nadia Alramli 09年

1
但是当然可以有多行代码(取决于是否启用了标记)-对于不管该标记是否启用都有效的解决方案,请参阅我的答案。
Peter Boughton

16
至少在某些实现中,正则表达式“ $ ^”与空字符串匹配。第二个更好。
罗曼·斯塔科夫

@romkyns第二个与我对PyQt4的调用中的空字符串不匹配QtCore.QRegExp。如此糟糕,因为执行起来肯定会更轻松。
2014年

43

(?!)应该总是不匹配。这是零宽度的负前瞻。如果括号中的内容匹配,则整个匹配失败。鉴于其中没有任何内容,它将使所有内容的匹配失败(包括所有内容)。


4
是的,我也打算发布此信息。如果您的语言支持先行,这是最好的方法。同样(?=)匹配每个字符串。
Brian Carper

16

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

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

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

为了不匹配任何内容(甚至是空字符串),只需尝试在字符串开头之前查找内容,例如:

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

由于\ A之前没有字符(按定义),因此始终无法匹配。


您的看起来比我的更好,因为我认为它的退出速度比使用行尾更快。
2009年

彼得,您使用\ z(小写),而我的Python口袋指南告诉我字符串结尾的断言是\ Z(大写)?
ThomasH 2010年

ThomasH,它们都是字符串的结尾,但是大写版本允许尾随换行符,而小写版本不允许。
彼得·布顿

嗯,很有趣,我发现这没有记载。另外,re.search( “BOO \ Z”, “fooboo”)不返回匹配对象,而re.search( “BOO \ Z”, “fooboo)一样。相反,re.search(” BOO \ž “,” foobooz“)匹配,这说明'\ z'被简单地解释为'z',对吧?!(在Python 2.6中是这样)
ThomasH 2010年

抱歉,我认为Python是PCRE,但事实证明存在一些差异,这就是其中之一。(请参见“锚”的regular-expressions.info/refflavors.html
彼得·鲍顿


1

您可以使用
\z..
这是字符串的绝对结尾,后跟两个

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


为什么要两个\z与相比\Z,IIRC不允许尾随换行符,所以一个就够了吗?或者这是一种奇怪的防御措施*(您为什么要防御这种情况?)
mpen

0

或者,使用一些列表理解来删除无用的正则表达式条目,然后将它们组合在一起。就像是:

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

确保通过以下代码在代码行旁边添加一些注释:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.