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

113 投票
6 回答
110265 浏览
提问于 2025-04-15 12:00

我有一个用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换成任何其他字符,它也总是无法匹配。

撰写回答