如何在正则表达式中为亵渎的坏词添加例外?
How to add exception for bad word in regular expression for profanity?
我使用 Python 正则表达式进行亵渎检查。我有一个阻止的单词列表,但有一些极端情况我想为坏词添加例外。
比如我的黑名单里有['foo','bar']。但我想豁免以下情况:
- “酒吧”
- “太棒了”
这是我目前在 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 ***
模式是\b(?!(?:BAR|foo good)\b)(?i:foo|bar)\b
。参见regex demo。它匹配:
\b
- 单词边界
(?!(?:BAR|foo good)\b)
- 没有紧接着 BAR
、foo good
(?i:foo|bar)
- 不区分大小写的修饰符组:foo
或 bar
匹配为...
\b
- 整个单词。
我使用 Python 正则表达式进行亵渎检查。我有一个阻止的单词列表,但有一些极端情况我想为坏词添加例外。
比如我的黑名单里有['foo','bar']。但我想豁免以下情况:
- “酒吧”
- “太棒了”
这是我目前在 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 ***
模式是\b(?!(?:BAR|foo good)\b)(?i:foo|bar)\b
。参见regex demo。它匹配:
\b
- 单词边界(?!(?:BAR|foo good)\b)
- 没有紧接着BAR
、foo good
(?i:foo|bar)
- 不区分大小写的修饰符组:foo
或bar
匹配为...\b
- 整个单词。