Python只替换re.sub匹配的一部分

时间:2012-08-20 12:24:39

标签: python regex match

以下Python脚本:re.sub("[^a-zA-Z]pi[^a-zA-Z]", "(math.pi)", "2pi3 + supirse")

结果为:'(math.pi) + supirse'

虽然pi之前和之后的非alpha匹配很重要,但我不希望在匹配中替换这些非alpha字符。我想看到以下输出:'2(math.pi)3 + supirse'

注意:之前的建议如下:re.sub("\Bpi\B", "(math.pi)", "2pi3 + supirse")

导致完全替换每个实例:'2(math.pi)3 + su(math.pi)rse'这也不是我想要的

3 个答案:

答案 0 :(得分:5)

请改用:re.sub("(?<=[^a-zA-Z])pi(?=[^a-zA-Z])", "(math.pi)", "2pi3 + supirse")

可视化:http://regex101.com/r/fX5wX3

答案 1 :(得分:1)

使用lookahead / lookbehind:

import re

print re.sub("(?<=[^a-zA-Z])pi(?=[^a-zA-Z])", "(math.pi)", "2pi3 + supirse")

请参见此处了解具体结果:http://ideone.com/rSd8H

答案 2 :(得分:0)

实际上,您需要一个小写"\b"表示字边界,而"\B"表示不是字边界

试试这个:

import re
re.sub(r"\bpi\b", "(math.pi)", "2pi3 + supirse")

这会产生'2pi3 + supirse'