如何在正则表达式中为亵渎的坏词添加例外?

How to add exception for bad word in regular expression for profanity?

我使用 Python 正则表达式进行亵渎检查。我有一个阻止的单词列表,但有一些极端情况我想为坏词添加例外。

比如我的黑名单里有['foo','bar']。但我想豁免以下情况:

  1. “酒吧”
  2. “太棒了”

这是我目前在 Python 中的做法:

profanity_list = ['foo', 'bar']
pattern_profanity = re.compile(r'\b({})\b'.format('|'.join(profanity_list)),
 flags=re.IGNORECASE)  # same as r'\b(foo|bar)\b'
s = 'foo BAR foo good Bar'
censor_char = '*'
pattern_profanity.sub(repl=lambda m: censor_char*len(m.group(0)), string=s)

这给了我“*** *** *** good ***”,但我希望结果是“*** BAR foo good ***”。我应该怎么做才能包括例外情况?这在正则表达式中可行吗?谢谢

顺便说一句,我找到的解决方案来自这个post

你需要

import re
profanity_list = ['foo', 'bar']
whitelist = ["BAR", "foo good"]
pattern_profanity = re.compile(
  r'\b(?!(?:{})\b)(?i:{})\b'.format('|'.join(whitelist),'|'.join(profanity_list)))  
s = 'foo BAR foo good Bar'
censor_char = '*'
print( re.sub(pattern_profanity, lambda m: censor_char*len(m.group(0)), s) )
# => *** BAR foo good ***

Python demo

模式是\b(?!(?:BAR|foo good)\b)(?i:foo|bar)\b。参见regex demo。它匹配:

  • \b - 单词边界
  • (?!(?:BAR|foo good)\b) - 没有紧接着 BARfoo good
  • (?i:foo|bar) - 不区分大小写的修饰符组:foobar 匹配为...
  • \b - 整个单词。