在Python中,我试图匿名或屏蔽n个字符(从最后一个字符开始)。它适用于匹配,但我也想忽略包含数字的单词。
例如
string = 'SomeText +12 555 660 000 f00b4r abc123'
digits = 5
repl_char = 'X'
regex = '[0-9\s\+]+'
for match in re.finditer(regex, string):
phone_no = match.group()
new_ph_no = ''
i = 0
if phone_no in ['', ' ']:
pass
else:
for phone_digit in phone_no[::-1]:
if phone_digit == ' ' or i >= digits:
new_ph_no += phone_digit
else:
new_ph_no += repl_char
i += 1
string = string.replace(phone_no, new_ph_no[::-1])
print(string)
当前输出:'SomeText +x2 555 6xx xxx fxxbxr abcxxx'
所需的输出:'SomeText +12 555 6XX XXX f00b4r abc123'
我尝试将'[^?!a-zA-Z(0-9).*$]'
添加到正则表达式中,以提供所需的输出,但是当我将字符串传递为'SomeText +12 555 660 000'
时失败了
我的意图是打印任何类型的字符串中的电话号码,并用'x'(或任何字符)替换n位数字
如何打印所需的输出?
答案 0 :(得分:2)
使用lambda
中的re.sub
,您可以执行以下操作:
>>> import re
>>> s = 'SomeText +12 555 660 000 f00b4r abc123'
>>> reg = r'(\b\d*(?: +\d+)*)((?: *\d){})(?! *\d)'
>>>
>>> print re.sub(reg.format('{5}'), lambda m: m.group(1) + re.sub(r'\d', 'X', m.group(2)), s)
SomeText +12 555 6XX XXX f00b4r abc123
>>>
>>> print re.sub(reg.format('{2}'), lambda m: m.group(1) + re.sub(r'\d', 'X', m.group(2)), s)
SomeText +12 555 660 0XX f00b4r abc123
详细信息:
(\b\d*(?: +\d+)*)((?: *\d){5})(?! *\d)
匹配后5个数字,其后跟0或空格分隔的数字,后跟可选空格和一个数字。re.sub
中,我们使用了lambda函数X
答案 1 :(得分:1)
如果数字始终以+开头,并且您想获得不带数字的完整数字,请使用:
\+(\d+(?:\s\d+)*)\b
,它将返回(从您的示例中):12 555 660 000
在线查看:https://regex101.com/r/aEeIgK/2
说明:
\+
首先在比赛开始前标识一个+。将其转义为+是一个正则表达式量词。\b
以单词边界结尾(因此,如果是以数字开头的混合字符串,则不会成为匹配项的一部分。)(\d+(?:\s\d+)*)
和括号(...)
是匹配项。
\d+
开头的一个或多个数字是桅杆。 \d
是数字; +
个用于一个或多个的量词。(?:\s\d+)*
可选(零个或多个)字符串,以空格\s
开头,后跟数字。(?:...)
是不匹配的括号。*
的零个或多个量词。\s
空白(只有一个)。