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

时间:2014-06-07 03:53:09

标签: python regex python-2.7

正如document所说:

  

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

所以这会有用,目的是匹配,以外的任何{},而不是{}内的In [188]: re.compile("(?<!\{)\,.").findall('a1,a2,a3,a4,{,a6}') Out[188]: [',a', ',a', ',a', ',{']

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]:

这可以使用稍微不同的查询:

'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'] ,则根据该文档,以下内容无法按预期工作:

{{1}}

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

这就是为什么这就是为什么设计了lookbehind(只匹配一些固定长度的字符串)?

2 个答案:

答案 0 :(得分:6)

  

实现这一目标的任何替代方案?

是。有一种非常简单的技术,这种情况与"regex-match a pattern unless..."

非常相似

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

{[^}]*}|(,)

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

以下是执行多项任务的演示,因此您可以进行选择(请参阅the demo)底部的输出:

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

    How to match (or replace) a pattern except in situations s1, s2, s3...

答案 1 :(得分:3)

您可以使用带有平衡括号的否定前瞻,而不是使用 Negative Lookbehind

,(?![^{]*\})

例如:

>>> re.findall(r',..(?![^{]*\})', 'a1,a2,a3,a4,{_some_unknown_length,a5,a6,a7}')
[',a2', ',a3', ',a4']