正则表达式忽略数字后跟一个单词/非数字字符

时间:2019-03-24 06:24:06

标签: python regex python-3.x regex-negation regex-lookarounds

在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位数字

如何打印所需的输出?

2 个答案:

答案 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函数
  • 在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空白(只有一个)。