正则表达式“匹配空”的语法?
我有一个用Python写的模板引擎,它大量使用正则表达式。它的拼接方式像这样:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
我可以修改每个子字符串(比如regexp1、regexp2等等)。
有没有什么简单又轻量的表达式可以匹配“什么都不匹配”的情况?我想在模板中使用它,但有时候正则表达式的元素后面会加上'+'或'*',所以我不能用空字符串,因为那样会报“没有东西可以重复”的错误。
6 个回答
18
要匹配一个空字符串——即使是在多行模式下——你可以使用 \A\Z
,所以:
re.compile('\A\Z|\A\Z*|\A\Z+')
这里的区别在于,\A
和 \Z
是用来表示整个字符串的开始和结束,而 ^
和 $
是用来表示每一行的开始和结束。因此,像 $^|$^*|$^+
这样的表达式可能会匹配包含换行符的字符串(如果启用了相关的标志)。
如果你想让匹配失败(甚至是空字符串),只需要尝试在字符串的开始之前寻找内容,比如:
re.compile('.\A|.\A*|.\A+')
由于根据定义,没有字符可以出现在 \A
之前,所以这个匹配总是会失败。
63
(?!)
这个东西总是会匹配失败。它被称为零宽负向前瞻。简单来说,如果括号里的内容能匹配上,那么整个匹配就会失败。因为括号里什么都没有,所以它会让任何东西(包括什么都没有)都匹配失败。
162
这段内容说的是,下面的内容是不会匹配到任何东西的:
re.compile('$^')
所以如果你把regexp1、regexp2和regexp3都换成'$^',那么就不可能找到匹配的内容。除非你使用了多行模式。
经过一些测试,我发现了一个更好的解决方案:
re.compile('a^')
这个方案是绝对无法匹配的,而且会比之前的方案更早失败。你可以把a换成任何其他字符,它也总是无法匹配。