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

时间:2010-11-21 03:14:19

标签: python regex

我有一个字符串。

"This is an [[example]] sentence. It is [[awesome]]“。

我想将[[.]]的所有实例替换为<b>.</b>,同时保留.

匹配的通配符文本

结果应该是: "This is an <b>example</b> sentence. It is <b>awesome</b>“。

我可以使用[[手动替换<b> ]]</b> {{1}},但更有意义的是立即执行此操作并保留文本之间的文本标签

我该怎么做?

注意:这是从数据库获取源并将其转换为HTML。它应该模仿wiki风格的语法。在这种情况下,[[x]]会产生粗体字。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

如何使用re.sub()和一些正则表达式魔术:

import re
re.sub(r'\[\[(.*?)\]\]', r'<b>\1</b>', "This is an [[example]] sentence. It is [[awesome]]");

答案 2 :(得分: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>.

答案 3 :(得分:1)

...这里使用正则表达式方法的优势可能是,当源文本没有匹配的[[]]对时,它可以防止进行替换。

也许很重要,也许不是。

答案 4 :(得分:0)

其他海报建议的方法肯定会奏效,但我想指出,使用常规表达式来完成这项任务会产生很大的性能影响。

您提供的示例也可以使用本机Python字符串操作解决,并且执行速度大约快3倍。

例如:

>>> import timeit
>>> st = 's = "This is an [[example]] sentence. It is [[awesome]]"'
>>> t = timeit.Timer('s.replace("[[","<b>").replace("]]","</b>")',st)
>>> t.timeit()  # Run 1000000 times
1.1733845739904609
>>> tr = timeit.Timer("re.sub(r'\[\[(.*?)\]\]', r'<b>\1</b>',s)",'import re; ' + st)
>>> tr.timeit() # Run 1000000 times
3.7482673050677704
>>> 

希望这有助于:)