正如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(只匹配一些固定长度的字符串)?
答案 0 :(得分:6)
实现这一目标的任何替代方案?
是。有一种非常简单的技术,这种情况与"regex-match a pattern unless..."
非常相似这是你的简单正则表达式:
{[^}]*}|(,)
交替|
的左侧与完整的{ brackets }
标记相匹配。我们将忽略这些匹配。右侧匹配并捕获第1组的逗号,我们知道它们是正确的逗号,因为它们与左侧的表达式不匹配。
以下是执行多项任务的演示,因此您可以进行选择(请参阅the demo)底部的输出:
SplitHere
替换,这样我们就可以执行任务4 ... 参考
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']