一日一技:如何正确使用 re.sub 的第二个参数

简介: 一日一技:如何正确使用 re.sub 的第二个参数

摄影:产品经理与产品经理两个人吃了20道菜

在Python的正则表达式模块re中,我们常用的一个方法是 re.sub。它的作用是正则替换。例如我要把字符串 abc123xyz456中的数字替换为 *号:

import re
a = 'abc123xyz456'
b = re.sub('\d+', '*', a)
print(b)

运行效果如下图所示:

但如果我们看过 Python 官方文档中,关于re.subAPI[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)

运行效果如下图所示:

目录
相关文章
|
4月前
Ceres库中参数理解
Ceres库中参数的理解,特别是仿函数中传参的含义,并提供了一个LeetCode问题的链接,该问题要求找出数组中和为目标值的两个数。
|
5月前
函数的不定参数你是这样用吗?
函数的不定参数你是这样用吗?
31 2
|
8月前
|
JavaScript 前端开发
分享函数中 this 在不同场景下的指向与默认值,动态指定函数 this 值的方法
分享函数中 this 在不同场景下的指向与默认值,动态指定函数 this 值的方法
|
8月前
|
小程序 区块链
血常规常见判断参数
血常规常见判断参数
75 0
|
8月前
|
存储 前端开发 Java
去掉参数中第一个“,”
去掉参数中第一个“,”
63 0
|
架构师 程序员 Go
有趣的“第二个系统”
什么是”第二个系统“? 这是一个有趣的概念,简单描述下:
有趣的“第二个系统”
self.doubleSpinBox.setGeometry(QtCore.QRect(20, 25, 101, 22))参数讲解
self.doubleSpinBox.setGeometry(QtCore.QRect(20, 25, 101, 22))参数讲解
334 0
7.2 函数的参数
1、给 b 变量设定一个默认的值 如果实参传入的时候,指定了 b 的值,那 b 优先选择传入的实参,当 b 没有值时,才会用默认值 def funcA(a,b=0):     print(a)     print(b) funcA(1)        # b 变量选择默认实参...
622 0
|
C++
C++函数及参数
传值->传递的是数据副本(结构、普通数据类型数据) 传地址->传递的是数据变量的地址(数组等) 传值的缺点是需要复制数据副本,数据量大可能增加内存需求,降低系统运行速度; 传地址也有传地址的不好的地方,比如在不需要修改原数据的时候,一不小心把数据修改了,造成程序的违需求性;
961 0