2015-12-21 53 views
3

在我的代码中,我从子表达式列表中生成正则表达式。加入表情,如果我把他们每个人在非匹配组(?:…)正常工作:无法匹配的正则表达式(对于生成的表达式)

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

问题是:这样做的结果是加盟的表达是一个更大的表达式一个子表达式,并subexpression可能是空的,但连接的表达式不能与空字符串匹配。

那么为什么要让成为一个正则表达式,这与不符? (?:(?!.).)会工作吗?如果不是,为什么不呢? Python的re引擎是否理解我尝试创建失败的分支并对其进行优化?

+1

有,如果它被标记为一个非捕获组是问题,如果一个空字符串相匹配? –

+0

'joined_expr'将用于连接的表达式,这是一个析取的分支。该分支不能匹配(即必须失败)。我在这里使用“匹配”一词作为“不会失败”。 – kay

+0

如果您正在寻找不对结果字符串进行操作(如果它为空),为什么不直接跳过re并执行match = regex.match(string);如果匹配和布尔(字符串):do_code' 它的方式更简单,可能比通过组合条件检查空字符串更快。 –

回答

4

备用使用正则表达式引擎所经过的时间:

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

它更简单,比(?:(?!.).)的长字符串,你获得相同的结果。

这里是的4231字符文本短在线测试:

+0

哇,谢谢! '\ Zx'正是我期待的! – kay

0

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

如果要强制匹配失败在一个模式的某个时刻,最便捷的方式来做到这一点是与(?!)因为一个空字符串总是匹配,这样就要求有没有断言是一个空字符串必须总是失败。回溯控制动词(*FAIL)(*F)(?!)的同义词。

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