在单词边界\ b的末尾匹配星号*

tes*_*ter 1 regex profanity

在构建一个轻量级的工具来检测被亵渎的用法时,我注意到在单词边界末尾检测特殊字符非常困难。

使用一个字符串元组,构建一个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)

有什么想法可以方便地设置以支持以特殊字符结尾的短语?

bob*_*ble 5

如果*不是\不是\ n和一个非单词字符,则它不是单词字符,因此不是马赫数。

假设初始字边界是好的,但要匹配sh*t,但没有 sh*t*或匹配f***!,但并不 f***a怎么样利用负的模拟你自己的单词边界先行

\b(...)(?![\w*])
Run Code Online (Sandbox Code Playgroud)

在regex101上观看此演示

如果需要,\b可以在后面用负号替换开头的单词边界:(?<![\w*])