1

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

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

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

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

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

4

3 回答 3

5

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

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

于 2012-08-20T12:36:27.980 回答
1

使用前瞻/后瞻:

import re

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

具体生成结果见这里:http: //ideone.com/rSd8H

于 2012-08-20T12:36:05.937 回答
0

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

试试这个:

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

那会产生'2pi3 + supirse'

于 2012-08-20T12:35:05.783 回答