最初我用过
re.sub(r'\b({0})\b'.format(T[i]), 'TARGET', j, flags=re.IGNORECASE)
但是有几句话没有得到妥善处理:
T[i] = '#dexter'
终于开始#dexter的第五季了。周末见到你!
和
T[i] = 'a$ap rocky'
AHHH!我的妈妈说我去参加A $ AP Rocky音乐会! 11月8日我们 出来了! #EXCITE
对于这两个实例,T [i]不会被' TARGET'作为第一个目标开头出现的标签符号,第二个目标出现美元符号。我也试过了r'\S*({0})\S*'
,但仍无法修复第二个实例。你能帮我指一下相关的正则表达式吗?谢谢!
答案 0 :(得分:1)
#dexter
\b
匹配单词边界,这是与\w+
匹配的序列两端的空字符串。但是#
与\w+
不匹配,因此字边界位于#
的右而不是 left < / em>的。一种可能的解决方案是使用否定lookaround而不是字边界:
r'(?<!\w)({0})(?!\w)'
a$ap rocky
$
字符在正则表达式中具有特殊含义。您应该在将输入字符串插入模式之前对其进行预处理。 re.escape
函数的设计完全符合以下条件:
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)