替换回调函数

使用re.sub来进行复杂的字符串替换时,只能将某一个或某几个字符替换称一样的字符串例如

1
2
3
4
import re
text = 'UPPER PYTHON, lower python, Mixed Python'
res = re.sub('python', 'snake', text, flags=re.IGNORECASE)
print(res)
1
UPPER snake, lower snake, Mixed snake

可以看到,替换的字符串并没有按照以前的大小写顺序来进行替换,都被统一替换成了snake,如果需要按照以前的大小写的顺序来替换的话,就需要使用到替换回掉函数,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import re

text = 'UPPER PYTHON, lower python, Mixed Python'
def matchcase(word):
def replace(m):
text = m.group()
if text.isupper():
return word.upper()
elif text.islower():
return word.lower()
elif text[0].isupper():
return word.capitalize()
else:
return word
return replace

res = re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)
print(res)

函数replace是我们的替换回调函数,输入的参数是一个匹配对象,由match()或find()返回,我们可以从debug中看出其工作流程

tihuanhuidiao

它会将匹配的对象依次去进行大小写的对比,然后再进行替换并返回正确的替换结果.