擅长:python、mysql、java
<p>为什么会发生这种情况:当您拆分字符串时,您会进行大量检查以确保您看到的是正确的用户,例如,您有<code>@me</code>和<code>@mentee</code>-因此对于用户<code>me</code>,它将匹配第一个,而不是第二个。你知道吗</p>
<p>然而,当你做替换时,你是在整个字符串上做替换-所以当你说用<code><@me></code>替换例如<code>@me</code>时,它对你的小心拆分一无所知-它只是在字符串中寻找<code>@me</code>并替换它。所以<code>@mentee</code>也包含<code>@me</code>,并且将被替换。你知道吗</p>
<p>两个(好吧,三个)选择:一个是在它周围加上空格,把它关起来(就像@parchent写的那样)。你知道吗</p>
<p>第二种方法是使用split:替换本地片段,而不是替换原始字符串。最简单的方法是使用枚举:</p>
<pre><code>new_array = old_string.split(' ')
for index, mention in enumerate(new_array):
for user in users:
if mention == user and len(mention) == len(user):
#We won't replace this in old_string, we'll replace the current entry
#old_string = old_string.replace(a, '<' + user + '>')
new_array[index] = '<%s>'%user
new_string = ' '.join(new_array)
</code></pre>
<p>第三条路。。。这有点复杂,但您真正想要的是将<code>'@anything'</code>的任何实例替换为<code><@anything></code>(可能是空白?)。您可以使用<code>re.sub</code>一次性完成此操作:</p>
<pre><code>new_string = re.sub(r'(@\w+)', r'<\g<0>>', old_string)
</code></pre>