我有一个大量使用regexp的python模板引擎。它使用如下连接:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
我可以修改单个子字符串(regexp1,regexp2等)。
是否有任何轻巧的表达式什么都不匹配,我可以在不需要任何匹配的模板中使用它?不幸的是,有时将'+'或'*'附加到regexp原子上,所以我不能使用空字符串-这将引发“无可重复”的错误。
我有一个大量使用regexp的python模板引擎。它使用如下连接:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
我可以修改单个子字符串(regexp1,regexp2等)。
是否有任何轻巧的表达式什么都不匹配,我可以在不需要任何匹配的模板中使用它?不幸的是,有时将'+'或'*'附加到regexp原子上,所以我不能使用空字符串-这将引发“无可重复”的错误。
Answers:
这不应该匹配任何东西:
re.compile('$^')
因此,如果用'$ ^'替换regexp1,regexp2和regexp3,将不可能找到匹配项。除非您使用多行模式。
经过一些测试,我找到了更好的解决方案
re.compile('a^')
不可能匹配,并且将比以前的解决方案更早失败。您可以将a替换为其他任何字符,但始终无法匹配
QtCore.QRegExp
。如此糟糕,因为执行起来肯定会更轻松。
(?!)
应该总是不匹配。这是零宽度的负前瞻。如果括号中的内容匹配,则整个匹配失败。鉴于其中没有任何内容,它将使所有内容的匹配失败(包括所有内容)。
要匹配空字符串(即使在多行模式下),也可以使用\A\Z
,所以:
re.compile('\A\Z|\A\Z*|\A\Z+')
区别在于\A
和\Z
是string的开始和结束,而^
and$
可以匹配lines的开始/结束,因此$^|$^*|$^+
有可能匹配包含换行符的字符串(如果启用了标志)。
为了不匹配任何内容(甚至是空字符串),只需尝试在字符串开头之前查找内容,例如:
re.compile('.\A|.\A*|.\A+')
由于\ A之前没有字符(按定义),因此始终无法匹配。
您可以使用
\z..
这是字符串的绝对结尾,后跟两个
如果最后加上+
或*
,这仍然可以拒绝匹配任何内容
\z
与相比\Z
,IIRC不允许尾随换行符,所以一个就够了吗?或者这是一种奇怪的防御措施*
(您为什么要防御这种情况?)