这是如何完成的:
import re
def replace_FOO(m):
if m.group(1) is None:
return m.group()
return m.group().replace("FOO", "XXX")
string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"
output = re.sub(r"'[^']*'|([^']*)", replace_FOO, string)
print(string)
print(output)
[编辑]
该re.sub
函数将接受字符串模板或函数作为替换。如果替换是一个函数,每次找到匹配时都会调用该函数,传递匹配对象,然后使用返回值(必须是字符串)作为替换字符串。
至于模式本身,当它搜索时,如果'
当前位置有 a ,它将匹配到并包括 next '
,否则它将匹配到但不包括'
字符串的下一个或结尾。
每次匹配都会调用替换函数并返回适当的结果。
其实,现在想来,我根本不需要用组。我可以这样做:
def replace_FOO(m):
if m.group().startswith("'"):
return m.group().replace("FOO", "XXX")
return m.group()
string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"
output = re.sub(r"'[^']*'|[^']+", replace_FOO, string)