正则表达式非固定长度的负向观察

CT *_*Zhu 7 python regex python-2.7

正如文件所述:

这被称为负面的后观断言.与正向lookbehind断言类似,包含的模式必须仅匹配某些固定长度的字符串.

所以这将起作用,意图是匹配任何,外部{},但不是内部{}:

In [188]:

re.compile("(?<!\{)\,.").findall('a1,a2,a3,a4,{,a6}')
Out[188]:
[',a', ',a', ',a', ',{']
Run Code Online (Sandbox Code Playgroud)

这将是一个稍微不同的查询:

In [189]:

re.compile("(?<!\{a5)\,.").findall('a1,a2,a3,a4,{a5,a6}')
#or this: re.compile("(?<!\{..)\,.").findall('a1,a2,a3,a4,{a5,a6}')
Out[189]:
[',a', ',a', ',a', ',{']
In [190]:
Run Code Online (Sandbox Code Playgroud)

但是,如果查询是'a1,a2,a3,a4,{_some_length_not_known_in_advance,a6}',根据该文档,以下将无法按预期工作:

In [190]:

re.compile("(?<![\{.*])\,.").findall('a1,a2,a3,a4,{a5,a6}')
Out[190]:
[',a', ',a', ',a', ',{', ',a']
Run Code Online (Sandbox Code Playgroud)

实现这个的任何替代方案?消极的看法是错误的做法吗?

任何原因这都是为什么lookbehind被设计为首先(只匹配一些固定长度的字符串)?

zx8*_*x81 6

实现这个的任何替代方案?

是.有一种非常简单的技术,这种情况非常类似于"正则表达式匹配模式,除非......"

这是你的简单正则表达式:

{[^}]*}|(,)
Run Code Online (Sandbox Code Playgroud)

交替的左侧 |匹配完整{ brackets }标签.我们将忽略这些匹配.右侧匹配并捕获第1组的逗号,我们知道它们是正确的逗号,因为它们与左侧的表达式不匹配.

这是一个执行多个任务的演示,因此您可以选择(参见演示底部的输出):

  1. 计算你想要匹配的逗号(不是大括号之间的逗号)
  2. 显示比赛(逗号... duh)
  3. 替换正确的逗号.在这里我们替换,SplitHere所以我们可以执行任务4 ...
  4. 在逗号上拆分,并显示拆分字符串

参考

如何匹配(或替换)模式除了情况s1,s2,s3 ......