Python regex忽略后跟单词/非数字字符的数字
在Python中,我试图匿名化或屏蔽n个字符(从最后一个)。它适用于比赛,但我想忽略包含数字的单词 e、 gPython 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数字
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
详细信息:
- 第一个正则表达式
匹配最后5个数字,这些数字前面有0或空格分隔的数字,后面没有可选的空格和数字(\b\d*(?:+\d+)((?:*\d){5})(?!*\d)
- 在
中,我们使用lambda函数re.sub
- 在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的详细解释。