Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python regex忽略后跟单词/非数字字符的数字_Python_Regex_Python 3.x_Regex Negation_Regex Lookarounds - Fatal编程技术网

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

Python regex忽略后跟单词/非数字字符的数字,python,regex,python-3.x,regex-negation,regex-lookarounds,Python,Regex,Python 3.x,Regex Negation,Regex Lookarounds,在Python中,我试图匿名化或屏蔽n个字符(从最后一个)。它适用于比赛,但我想忽略包含数字的单词 e、 g string='SomeText+12555660000 f00b4r abc123' 数字=5 repl_char='X' 正则表达式='[0-9\s\+]+' 对于re.finditer(正则表达式,字符串)中的匹配: 电话号码=match.group() 新项目编号=“” i=0 如果电话号码不在['','': 通过 其他: 对于电话号码[:-1]中的电话号码: 如果电话\ U数字

在Python中,我试图匿名化或屏蔽n个字符(从最后一个)。它适用于比赛,但我想忽略包含数字的单词

e、 g

string='SomeText+12555660000 f00b4r abc123'
数字=5
repl_char='X'
正则表达式='[0-9\s\+]+'
对于re.finditer(正则表达式,字符串)中的匹配:
电话号码=match.group()
新项目编号=“”
i=0
如果电话号码不在['','':
通过
其他:
对于电话号码[:-1]中的电话号码:
如果电话\ U数字==''或i>=数字:
新电话号码+=电话号码
其他:
新的\u ph\u no+=repl\u char
i+=1
string=string.replace(电话号码,新号码[:-1])
打印(字符串)
当前输出:
'SomeText+x2 555 6xx xxx fxbxr abcxx'

所需输出:
'SomeText+12555 6XX XXX f00b4r abc123'

我尝试将
'[^?!a-zA-Z(0-9)。*$]'
添加到正则表达式中,它给出了所需的输出,但当我将字符串作为
'SomeText+12 555 660 000'传递时失败。

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


如何打印所需的输出?

如果数字总是以+开头,并且您希望在没有它的情况下获得完整的数字,请使用:

\+(\d+(?:\s\d+)*)\b
它将返回(从您的示例中):
12555660000

见在线:

说明:

  • \+
    在比赛开始前先确定a+。将其转义为+是一个regexp量词
  • \b
    以单词边界结尾(因此,如果是以数字开头的混合字符串,它将不属于匹配的一部分)
  • (\d+(?:\s\d+*)
    括号内的
    (…)
    是匹配项。
    • \d+
      开头的一个或多个数字是桅杆<代码>\d为数字<代码>+一个或多个的量词
    • (?:\s\d+*
      可选(零个或多个)字符串,以空格开头,后跟数字
    • (?:…)
      是不匹配的括号
    • *
      零或更多的量词
    • \s
      空白(只有一个)

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或空格分隔的数字,后面没有可选的空格和数字
  • re.sub
    中,我们使用lambda函数
  • 在lambda函数体内,我们将每个数字替换为字母
    X

为什么标记从
660
的第二位开始,为什么不从
555
的第二位开始?@anubhava,看着
数字=5
,我相信数字部分的最后5位可能需要更换?是的,从最后一位开始。但是如果我把“5”改为“2”,它就不起作用了<代码>>>s='SomeText+12 555 660 000 f00b4r abc123'
>print(re.sub(r'(?:*\d){2}(?*\d'),lambda m:re.sub(r'\d',X',m.group(0))
>SomeText+12 555 660 0XX FXXBB4R abc1XX
如果我删除'f',你能解释一下吗,如果可能的话。@san1512我已经在regexp结尾添加了单词边界,因此它将适用于注释中的示例。添加了对regexp的详细解释。