Python: 替换标签但保留内文本?
我有一个字符串。
"这是一个 [[例子]] 句子。它是 [[很棒]]"
。
我想把所有的 [[.]]
替换成 <b>.</b>
,同时保留 .
匹配到的内容。
结果应该是:"这是一个 <b>例子</b> 句子。它是 <b>很棒</b>"
。
我可以手动把 [[
替换成 <b>
,把 ]]
替换成 </b>
,但一次性处理更合理,还能保留标签之间的文字。
我该怎么做呢?
注意:这是为了从数据库获取内容并转换成HTML格式。它的目的是模仿维基百科的语法。在这种情况下,[[x]]
会变成粗体字。
5 个回答
2
这段代码让你可以随意扩展替换列表。
import re
_replacements = {
'[[': '<b>',
']]': '</b>',
'{{': '<i>',
'}}': '</i>',
}
def _do_replace(match):
return _replacements.get(match.group(0))
def replace_tags(text, _re=re.compile('|'.join(re.escape(r) for r in _replacements))):
return _re.sub(_do_replace, text)
print replace_tags("This is an [[example]] sentence. It is [[{{awesome}}]].")
This is an <b>example</b> sentence. It is <b><i>awesome</i></b>.
4
关于使用 re.sub()
和一些正则表达式的小技巧,你觉得怎么样:
import re
re.sub(r'\[\[(.*?)\]\]', r'<b>\1</b>', "This is an [[example]] sentence. It is [[awesome]]");
5
你可以直接在字符串上使用 replace
方法。
>>> s = 'This is an [[example]] sentence. It is [[awesome]].'
>>> s.replace('[[', '<b>').replace(']]', '</b>')
'This is an <b>example</b> sentence. It is <b>awesome</b>.'
这里给大家提供一些时间测试的结果:
$ python -mtimeit -s'import re' "re.sub(r'\[\[(.*?)\]\]', r'<b>\1</b>', 'This is an [[example]] sentence. It is [[awesome]]')"''
100000 loops, best of 3: 19.7 usec per loop
$ python -mtimeit '"This is an [[example]] sentence. It is [[awesome]]".replace("[[", "<b>").replace("]]", "</b>")'
100000 loops, best of 3: 1.94 usec per loop
如果我们编译正则表达式,性能会稍微好一些:
$ python -mtimeit -s"import re; r = re.compile(r'\[\[(.*?)\]\]')" "r.sub( r'<b>\1</b>', 'This is an [[example]] sentence. It is [[awesome]]')"
100000 loops, best of 3: 16.9 usec per loop