在构建一个轻量级的工具来检测被亵渎的用法时,我注意到在单词边界末尾检测特殊字符非常困难。
使用一个字符串元组,构建一个OR'd单词边界正则表达式:
import re
PHRASES = (
'sh\\*t', # easy
'sh\\*\\*', # difficult
'f\\*\\*k', # easy
'f\\*\\*\\*', # difficult
)
MATCHER = re.compile(
r"\b(%s)\b" % "|".join(PHRASES),
flags=re.IGNORECASE | re.UNICODE)
Run Code Online (Sandbox Code Playgroud)
问题是,在*单词边界旁边无法检测到\b。
print(MATCHER.search('Well f*** you!')) # Fail - Does not find f***
print(MATCHER.search('Well f***!')) # Fail - Does not find f***
print(MATCHER.search('f***')) # Fail - Does not find f***
print(MATCHER.search('f*** this!')) # Fail - Does not find f***
print(MATCHER.search('secret code is 123f***')) # Pass - Should not match
print(MATCHER.search('f**k this!')) # Pass - Should find
Run Code Online (Sandbox Code Playgroud)
有什么想法可以方便地设置以支持以特殊字符结尾的短语?
如果*不是\而不是\ n和一个非单词字符,则它不是单词字符,因此不是马赫数。
假设初始字边界是好的,但要匹配sh*t,但没有 sh*t*或匹配f***!,但并不 f***a怎么样利用负的模拟你自己的单词边界先行。
\b(...)(?![\w*])
Run Code Online (Sandbox Code Playgroud)
如果需要,\b可以在后面用负号替换开头的单词边界:(?<![\w*])