我试图在另一个字符串中找到一个字符串,并在每次以不区分大小写的方式找到它之前和之后插入文本。
我已经提出了以下内容,它起作用,它感觉不太理想,所以我想知道是否有人有更有效的方法。
import re
test_string = "My name is Jon not jon."
search = re.compile(re.escape('jon'), re.IGNORECASE)
find = re.findall(search, test_string)
for found in find:
test_string = test_string.replace(found, '<span>%s</span>' % found)
print test_string
"My name is <span>Jon</span> not <span>jon</span>"
任何想法都会受到赞赏。
答案 0 :(得分:3)
这是re.sub
的用途:
>>> re.sub('(?i)(jon)', r'<span>\1</span>', s)
'My name is <span>Jon</span> not <span>jon</span>.'
(注意我使用(?i)
而不是re.I
(但两者之间没有区别),并捕获了组,即替换字符串的\1
另请注意:您可能希望考虑使用单词边界或类似内容,以便您实际上只替换单词“jon”,而不是“jonathan”或类似单词 - 取决于要求。
答案 1 :(得分:1)
import re
test_string = "My name is Jon not jon."
output = re.sub('([jJ]on)',r'<span>\1</span>', test_string)
print output
输出:
My name is <span>Jon</span> not <span>jon</span>.
如果您想更明智地过滤正则表达式匹配,最好在space
之前和之后[Jj]on
添加( [Jj]on )
。因此它只匹配单词jon
。
output = re.sub('( [jJ]on )',r'<span>\1</span>', test_string)
OR 修改强> 正如@Jon Clements建议的那样,你可以使用单词边界而不是空格。