我有一个大量使用regexp的python模板引擎。它使用连接,如:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
我可以修改单个子串(regexp1,regexp2等)。
是否有任何小而轻的表达式无法匹配,我可以在模板中使用,我不想要任何匹配?不幸的是,有时'+'或'*'被附加到regexp原子,因此我不能使用空字符串 - 这将引发“无需重复”错误。
答案 0 :(得分:88)
这不应该匹配任何东西:
re.compile('$^')
因此,如果用'$ ^'替换regexp1,regexp2和regexp3,将无法找到匹配项。除非您使用多线模式。
经过一些测试后我找到了更好的解决方案
re.compile('a^')
无法匹配,并且会比先前的解决方案更早失败。您可以将a替换为任何其他角色,但始终无法匹配
答案 1 :(得分:28)
(?!)
应始终无法匹配。这是零宽度负面预测。如果括号中的内容匹配则整个匹配失败。鉴于它没有任何内容,它将失败任何东西(包括什么都没有)。
答案 2 :(得分:15)
要匹配空字符串 - 即使在多线模式下 - 您也可以使用\A\Z
,所以:
re.compile('\A\Z|\A\Z*|\A\Z+')
区别在于\A
和\Z
是字符串的开头和结尾,而^
和$
这些可以匹配开始/结束行,因此$^|$^*|$^+
可能匹配包含换行符的字符串(如果启用了该标志)。
无法匹配任何内容(甚至是空字符串),只需尝试在字符串开头之前查找内容,例如:
re.compile('.\A|.\A*|.\A+')
由于在\ A(根据定义)之前不能出现任何字符,因此总是无法匹配。
答案 3 :(得分:3)
也许'.{0}'
?
答案 4 :(得分:1)
你可以使用
\z..
这是字符串的绝对结尾,后跟两个
如果最后添加+
或*
,这仍然可以拒绝匹配任何内容
答案 5 :(得分:0)
或者,使用一些列表推导来删除无用的正则表达式条目并加入以将它们放在一起。类似的东西:
re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))
请务必在该行代码旁边添加一些注释: - )