日间;夜间:>>> re.sub('([a-z])-(?=[a-z])', r'\1', 'oblig-a-tory hyphen-ated Asia-Pacific 11-12')
'obligatory hyphenated Asia-Pacific 11-12'
或者
^{pr2}$
上下文替换(“查找由小写字母包围的所有连字符”)的主要复杂情况是尾部上下文(要匹配的模式后面的部分)不能包含在匹配中。如果是,它将不能参加下一场领先的比赛。在
举个例子可能会让这一点更清楚。在
天真的解决方案是>>> re.sub('([a-z])-([a-z])', r'\1\2', 'hyphen-ated Asia-Pacific 11-12')
'hyphenated Asia-Pacific 11-12'
它与问题中的调用不同,因为它匹配连字符周围的小写字母,捕获它们以便将它们重新插入到结果中。在本例中,模式匹配的唯一子字符串是n-a,它被正确地替换为na。在
但假设我们有两个连字符靠得更近,像这样:>>> re.sub('([a-z])-([a-z])', r'\1\2', 'oblig-a-tory hyphen-ated Asia-Pacific 11-12')
'obliga-tory hyphenated Asia-Pacific 11-12'
a是匹配g-a的一部分,搜索在a之后的-处恢复。所以它从来没有看到过a-t的模式,它本来会匹配的。在>>> re.sub('([a-z])-(?=[a-z])', r'\1', 'oblig-a-tory hyphen-ated Asia-Pacific 11-12')
'obligatory hyphenated Asia-Pacific 11-12'
现在后面的上下文(连字符后面的小写字母)不是匹配的一部分,因此我们不需要在替换中重新插入它。这意味着,在将g-与尾随a匹配后,搜索将从a开始,下一个匹配将是{},后面是{}。在
Python还可以执行“lookbehinds”,即只有在模式前面有另一个模式时,模式才会匹配。同时使用lookback和lookahead,我们可以写下:
^{pr2}$
这也会产生正确的答案。现在我们只是匹配连字符,但坚持它的前面和后面都是小写字母。因为匹配只是连字符,所以替换字符串可以是空的。在
有时用这样的后视加速比赛。有时它会减慢速度。如果速度对你很重要,那么用特定的模式做一个基准测试总是值得的。但首要任务是把比赛弄对。在