>>> from env_helper import info; info()
页面更新时间: 2024-03-29 09:03:32
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

1.7. sub 方法替换字符串

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0)

参数:

  • pattern : 正则中的模式字符串。

  • repl : 替换的字符串,也可为一个函数。

  • string : 要被查找替换的原始字符串。

  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

正则表达式不仅能找到文本模式,而且能够用新的文本替换掉这些模式。 `Regex 对象的 sub() 方法需要传入两个参数。 第一个参数是一个字符串,用于取代发现的匹配。 第二个参数是一个字符串,即正则表达式。 sub()方法返回替换完成后的字符串。 例如,在交互式环境中输入以下代码:

>>> import re
>>> namesRegex = re.compile(r'Agent \w+')
>>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.')
'CENSORED gave the secret documents to CENSORED.'

有时候,你可能需要使用匹配的文本本身,作为替换的一部分。 在 sub() 的第一个参数中,可以输入1、2、3……。 表示“在替换中输入分组1、2、3……的文本”。

例如,假定想要隐去密探的姓名,只显示他们姓名的第一个字母。 要做到这一点,可以使用正则表达式 Agent(\w)\w*, 传入 r'\l****' 作为 sub() 的第一个参数。 字符串中的 \1 将由分组1匹配的文本所替代, 也就是正则表达式的(:raw-latex:`\w`)分组。

>>> agentNamesRegex =re.compile(r'Agent (\w)\w*')
>>> agentNamesRegex.sub(r'\1****','Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.')
'A**** told C**** that E**** knew B**** was a double agent.'

1.7.1. 示例

>>> phone = "2004-959-559 # 这是一个电话号码"
>>>
>>> # 删除注释
>>> num = re.sub('#.*$', "", phone)
>>> print ("电话号码 : ", num)
>>>
>>> # 移除非数字的内容
>>> num = re.sub('\D', "", phone)
>>> print ("电话号码 : ", num)
电话号码 :  2004-959-559
电话号码 :  2004959559

1.7.2. 将字符串替换为“函数”

以下实例中将字符串中的匹配的数字乘于 2:

>>> # 将匹配的数字乘于 2
>>> def double(matched):
>>>     value = int(matched.group('value'))
>>>     return str(value * 2)
>>>
>>> s = 'A23G4HFD567'
>>> print(re.sub('(?P<value>\d+)', double, s))
A46G8HFD1134
>>> def double(matched):
>>>     value = matched.group('value')
>>>     return value.strip().strip('`')
>>>
>>> s = 'A23G4HFD``567'
>>> print(re.sub('(?P<value>``.*?``)', double, s))
A23G4HFD``567
>>> uu = re.search('(?P<value>\d+)',  s)
>>> uu
<re.Match object; span=(1, 3), match='23'>
>>> uu.group()
'23'