re.sub匹配多字表达与特殊符号

时间:2015-10-19 22:47:03

标签: python regex

最初我用过

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*',但仍无法修复第二个实例。你能帮我指一下相关的正则表达式吗?谢谢!

1 个答案:

答案 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)