2

我试图在另一个字符串中找到一个字符串,并在每次以不区分大小写的方式找到它之前和之后插入文本。

我想出了以下方法,它有效,但感觉不太理想,所以我想知道是否有人有更有效的方法。

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>"

任何想法,将不胜感激。

4

2 回答 2

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”等 - 取决于要求。

于 2013-01-21T03:19:14.217 回答
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>.

如果您想更明智地过滤您的正则表达式匹配,最好在likespace之前和之后放置一个。所以它只会匹配单词。[Jj]on( [Jj]on )jon

output = re.sub('( [jJ]on )',r'<span>\1</span>', test_string)

编辑: 正如@Jon Clements 建议的那样,您可以使用单词边界而不是空格。

于 2013-01-21T03:22:59.630 回答