正则表达式忽略数字后跟 word/non-numeric 字符
regex to ignore number followed by a word/non-numeric character
在 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'
传递时失败了
我的意图是从任何类型的字符串中打印 phone 数字,并将 n 位数字替换为 'x'(或任何字符)
如何打印所需的输出?
如果数字总是以 + 开头,而您想获得没有它的完整数字,请使用:
\+(\d+(?:\s\d+)*)\b
它会 return(根据你的例子):12 555 660 000
在线查看:https://regex101.com/r/aEeIgK/2
解释:
\+
首先在我们的比赛开始前确定一个 +。将其转义为 + 是正则表达式量词。
\b
以单词边界结尾(因此如果是以数字开头的混合字符串,它将不会成为匹配项的一部分)。
(\d+(?:\s\d+)*)
括号 (...)
是匹配项。
\d+
开头的一个或多个数字是桅杆。 \d
为数字; +
一个或多个的量词。
(?:\s\d+)*
可选(零个或多个)以白色开头的字符串 space \s
后跟数字。
(?:...)
是一个不匹配的括号。
*
零个或多个的量词。
\s
白色space(只有一个)。
在 re.sub
中使用 lambda
你可以:
>>> 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 或 space 分隔的数字,后面没有可选的 space 和一个数字。
- 在
re.sub
中我们使用lambda函数
- 在 lambda 函数体内,我们用字母替换每个数字
X
在 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'
我的意图是从任何类型的字符串中打印 phone 数字,并将 n 位数字替换为 'x'(或任何字符)
如何打印所需的输出?
如果数字总是以 + 开头,而您想获得没有它的完整数字,请使用:
\+(\d+(?:\s\d+)*)\b
它会 return(根据你的例子):12 555 660 000
在线查看:https://regex101.com/r/aEeIgK/2
解释:
\+
首先在我们的比赛开始前确定一个 +。将其转义为 + 是正则表达式量词。\b
以单词边界结尾(因此如果是以数字开头的混合字符串,它将不会成为匹配项的一部分)。(\d+(?:\s\d+)*)
括号(...)
是匹配项。\d+
开头的一个或多个数字是桅杆。\d
为数字;+
一个或多个的量词。(?:\s\d+)*
可选(零个或多个)以白色开头的字符串 space\s
后跟数字。(?:...)
是一个不匹配的括号。*
零个或多个的量词。\s
白色space(只有一个)。
在 re.sub
中使用 lambda
你可以:
>>> 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 或 space 分隔的数字,后面没有可选的 space 和一个数字。 - 在
re.sub
中我们使用lambda函数 - 在 lambda 函数体内,我们用字母替换每个数字
X