Python: 替换标签但保留内文本?

0 投票
5 回答
3663 浏览
提问于 2025-04-16 07:24

我有一个字符串。

"这是一个 [[例子]] 句子。它是 [[很棒]]"

我想把所有的 [[.]] 替换成 <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

撰写回答