Python 具有特殊符号的子匹配多词表达式

Python 具有特殊符号的子匹配多词表达式,python,regex,Python,Regex,最初我用 re.sub(r'\b({0})\b'.format(T[i]), 'TARGET', j, flags=re.IGNORECASE) 但有几句话没有得到适当处理: T[i] = '#dexter' 终于开始了《德克斯特》的第五季。周末再见 及 啊!我妈妈同意我去听A$AP摇滚音乐会!!11月8日我们 出去#激发 对于这两个实例,T[i]没有被“TARGET”替换为出现在第一个目标开头的标签符号和出现在第二个目标中的美元符号。我还尝试了r'\S*({0})\S*”,但仍然无法修复第

最初我用

re.sub(r'\b({0})\b'.format(T[i]), 'TARGET', j, flags=re.IGNORECASE)
但有几句话没有得到适当处理:

T[i] = '#dexter'
终于开始了《德克斯特》的第五季。周末再见

啊!我妈妈同意我去听A$AP摇滚音乐会!!11月8日我们 出去#激发

对于这两个实例,T[i]没有被“TARGET”替换为出现在第一个目标开头的标签符号和出现在第二个目标中的美元符号。我还尝试了
r'\S*({0})\S*”
,但仍然无法修复第二个实例。你能帮我指定相关的正则表达式吗?谢谢

#dexter
\b
匹配单词边界,该边界是序列两端与
\w+
匹配的空字符串。但是,
#
\w+
不匹配,因此单词边界位于
#
的右侧,而不是左侧。一种可能的解决方案是使用负数而不是单词边界:

r'(?<!\w)({0})(?!\w)'
把两者结合起来
re.sub(r')(?使用lookarounds检查子字符串前后的空格(或其他字符,如标点符号)或字符串的开头和结尾,而不是单词边界。谢谢。但是
\S*({0})\S*
的格式不是严格正确的,例如
re.sub(r'\S*({0})\S*)格式(re.escape('dexter')),“$T$”,“我爱#德克斯特#德克斯特耶”,flags=re.IGNORECASE)
给出的是
'i love$T$$T$'
而不是
'i love$T$#dexteryeah'
。我想做一些特殊的标记,例如,@|#|$|基本上是单词的一部分。@Blue482-
\S*
基本上毫无价值,因为它总是匹配的。例如,
abc#dexter
也匹配。在我建议下注之前,我必须早点出发好吧,不过我现在更新了我的答案。太棒了!谢谢温先生!
r'(?<!\w)({0})(?!\w)'
re.sub(r'\b({0})\b'.format(re.escape(T[i])), 'TARGET', j, flags=re.IGNORECASE)
re.sub(r'(?<!\w)({0})(?!\w)'.format(re.escape(T[i])), 'TARGET', j, flags=re.IGNORECASE)