我使用以下正则表达式在文本中查找电话号码(号码可以带或不带国家代码,使用不同的分隔符等):
phonePattern = re.compile(".*?\d?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?", re.S)
result = phonePattern.search(text)
现在我想用X替换数字。例如,如果我找到了1 (123) 123-4567
之类的电话,则应在文本中将其替换为1 (XXX) XXX-XXXX
。我该怎么办?
答案 0 :(得分:2)
使用phonePattern.sub()
来电,但放弃.*?
开始和结束(无论如何都不需要这些):
phonePattern = re.compile("\d?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4})")
result = phonePattern.sub(lambda m: re.sub('\d', 'X', m.group(1)), text)
如果没有.*?
模式,也可以删除re.S
标志。领先的\d?
在这里是多余的;在该数字与(
字符之间没有空格允许它肯定与您的样本模式不匹配。
对于找到的每个匹配项,都会调用lambda
函数来提供替换,只需获取分组文本(m.group(1)
)并用X
个字符替换所有数字。
演示:
>>> import re
>>> text = 'Here is a phone number: 1 (123) 123-4567'
>>> phonePattern = re.compile("\d?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4})", re.S)
>>> phonePattern.sub(lambda m: re.sub('\d', 'X', m.group(1)), text)
'Here is a phone number: 1 (XXX) XXX-XXXX'
答案 1 :(得分:0)
import re
phone = "1 (123) 123-4567"
replaced_phone = phone[0] + re.sub("\d", "X", phone[1:]) # 1 (XXX) XXX-XXXX