一个无法匹配的正则表达式(用于生成表达式)。

3

在我的代码中,我从子表达式列表生成一个正则表达式。如果将每个子表达式放入非匹配组(?:...)中,则连接表达式的工作正常:

# concatenation:
joined_expr = ''.join('(?:{})'.format(expr) for expr in subexpression)
# disjunction:
joined_expr = '|'.join('(?:{})'.format(expr) for expr in subexpression)

问题是:这个连接表达式的结果是更大表达式的子表达式,而子表达式可能为空,但连接表达式不能匹配空字符串。
那么最简单的方法是什么来制作一个无法匹配的正则表达式呢?(?:(?!.).)可以吗?如果不行,为什么不行?Python的re引擎是否能理解我试图创建失败分支并优化它的尝试?

1
如果一个非捕获组被标记了,那么它是否匹配空字符串有关系吗? - Martin Konecny
joined_expr将用于连接表达式,这是析取的一个分支。该分支必须不匹配(即必须失败)。我在这里使用了“匹配”一词表示“不失败”。 - Kijewski
如果您希望在结果字符串为空时不执行操作,为什么不跳过re并执行match = regex.match(string); if match & bool(string): do_code呢?这比通过re检查组合条件的空字符串要简单得多,而且可能更快。 - Alex Huszagh
2个回答

4

使用以下方法节省正则表达式引擎的时间:

 \Zx # or '$s' to match a literal after the end of the string

对于长字符串来说,它比(?:(?!.).)更简单,并且可以得到相同的结果。

这是一个长度为4231字符的短小在线测试:


哇,谢谢!\Zx 正是我在寻找的! - Kijewski

0

在理解否定前瞻断言的引擎中,可以使用(?!)。PCRE使用(*FAIL)作为更易读的同义词。

如果要在模式中某个点上强制匹配失败,最方便的方法是使用(?!),因为空字符串始终匹配,所以需要不允许存在空字符串的断言必定失败。回溯控制动词(*FAIL)(*F)(?!)的同义词。

-- http://www.pcre.org/current/doc/html/pcre2pattern.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接