Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 在正则表达式中组合paren和单词边界_Python_Regex - Fatal编程技术网

Python 在正则表达式中组合paren和单词边界

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'表示值中的值] 组合的

我有一个字符串,其中包含几种类型的个人识别信息(PII):

你好,我叫汤姆,我爱Tomcat。我的电子邮件地址是tom@foo.bar我的电话号码是(201)5550123。” 我还有一个要从字符串中删除的PII列表:

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)