regex忽略后跟单词/非数字的数字

2024-09-27 21:24:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在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).*$]'添加到regex中,它提供了所需的输出,但当我将字符串作为'SomeText +12 555 660 000'传递时失败了

我的意图是从任何类型的字符串打印电话号码,并用“x”(或任何字符)替换n个数字

如何打印所需的输出?你知道吗


Tags: noinnewstringphone数字replph
2条回答

如果数字总是以+开头,并且您希望不使用它来获取完整的数字,请使用:

\+(\d+(?:\s\d+)*)\b

它将返回(从您的示例中):12 555 660 000

在线查看:https://regex101.com/r/aEeIgK/2

说明:

  • \+在比赛开始前先确定一个+开始。转义为+是regexp量词。你知道吗
  • \b以单词边界结尾(因此,如果是以数字开头的混合字符串,则它不会是匹配的一部分)。你知道吗
  • (\d+(?:\s\d+)*)带括号(...)是匹配的内容。
    • \d+开头的一个或多个数字是桅杆。\d是数字;+一个或多个量词。你知道吗
    • (?:\s\d+)*可选(零个或更多)字符串,以空格\s开头,后跟数字。你知道吗
    • (?:...)是不匹配的括号。你知道吗
    • *表示零或更多的量词。你知道吗
    • \s空白(只有一个)。你知道吗

使用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替换每个数字

相关问题 更多 >

    热门问题