摄影:产品经理与产品经理两个人吃了20道菜
在Python的正则表达式模块re中,我们常用的一个方法是 re.sub
。它的作用是正则替换。例如我要把字符串 abc123xyz456
中的数字替换为 *
号:
import re a = 'abc123xyz456' b = re.sub('\d+', '*', a) print(b)
运行效果如下图所示:
但如果我们看过 Python 官方文档中,关于re.sub
的 API[1],我们会发现,第二个参数不仅可以是字符串,还可以是一个函数,如下图所示:
如果第二个参数是函数,那么它需要接收一个参数,这个参数是一个match
对象。如下图所示:
原字符串中有多少项被匹配到,这个函数就会被调用几次。
至于传进来的这个match
对象,我们调用它的.group(0)
方法,就能获取到被匹配到的内容,如下图所示:
这个功能有什么用呢?我们设想有一个字符串abc18123456794xyz123
,这个字符串中有两段数字,并且长短是不一样的。第一个数字是11位的手机号。我想把字符串替换为:abc[隐藏手机号]xyz***
。不是手机号的数字,每一位数字逐位替换为星号。
如果你不知道re.sub
第二个参数可以是函数,那么你可能需要写两次正则替换:
import re a = 'abc18123456794xyz123' b = re.sub('\d{11}', '[隐藏手机号]', a) c = re.sub('\d', '*', b) print(c)
如下图所示:
但现在有了新方法以后,解决方案就简单了:
import re def test(repl): if len(repl.group(0)) == 11: return '[隐藏手机号]' else: return '*' * len(repl.group(0)) a = 'abc18123456794xyz123' b = re.sub('\d+', test, a) print(b)
运行效果如下图所示: