正则表达式忽略数字后跟 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