Python 在正则表达式中组合paren和单词边界
我有一个字符串,其中包含几种类型的个人识别信息(PII): 你好,我叫汤姆,我爱Tomcat。我的电子邮件地址是tom@foo.bar我的电话号码是(201)5550123。” 我还有一个要从字符串中删除的PII列表:Python 在正则表达式中组合paren和单词边界,python,regex,Python,Regex,我有一个字符串,其中包含几种类型的个人识别信息(PII): 你好,我叫汤姆,我爱Tomcat。我的电子邮件地址是tom@foo.bar我的电话号码是(201)5550123。” 我还有一个要从字符串中删除的PII列表: value=['Tom','tom@foo.bar', '(201) 5550123'] 我希望将这些值组合到一个正则表达式中,并一次性替换它们,而不是在这些值上循环,一次替换一个: 转义\u值=[r'\b'+re.escape(value)+r'\b'表示值中的值] 组合的
value=['Tom','tom@foo.bar', '(201) 5550123']
我希望将这些值组合到一个正则表达式中,并一次性替换它们,而不是在这些值上循环,一次替换一个:
转义\u值=[r'\b'+re.escape(value)+r'\b'表示值中的值]
组合的_模式=“|”。联接(转义的_值)
组合正则表达式=重新编译(组合模式)
单词边界很重要,因为我不想把“Tom”从“Tomcat”中去掉,除非它自己出现。不管怎么说,除了电话号码之外,这几乎是可行的:
combined_regex.sub(“”,文本)
#你好,我的名字是,我爱雄猫。我的电子邮件地址是,电话号码是(201)5550123。”
我有点孤立这个问题。这与paren和单词边界的组合有关:
re.compile(r'\b\(201\)\5550123\b').sub(“,”,在(201)5550123之后)
#'之前(201)5550123之后'
这不是Python的问题,从这里可以看出:
我知道有很多方法可以改变我的程序,但我不明白为什么这个正则表达式不起作用,它让我发疯。你可以使用:
重新导入
text='你好,我叫汤姆,我爱Tomcat。我的电子邮件地址是tom@foo.bar我的电话号码是(201)5550123。”
值=['Tom','tom@foo.bar', '(201) 5550123']
转义_值=[值中值的转义(值)]
组合_模式=r'(?)?
(?:
:启动非捕获组
Tom|tom@foo\.bar | \(201\)\5550123
:匹配其中一个子字符串,并用
分隔(替换)
)
:结束非捕获组
(?!\w)
:负向前看,断言当前位置后没有单词字符
可以找到解释和几种解决方案。这里的实际问题涉及到\b
和\(
)的交互作用。如果删除首字母\b
,它会起作用。\b
匹配标点符号,因此看不到“单词边界”Wiktor的参考文献很好。实际问题是误解了\b
匹配的内容。请参阅。
(?<!\w)(?:Tom|tom@foo\.bar|\(201\)\ 5550123)(?!\w)