我有一个字符串。
"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]]会产生粗体字。
答案 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
>>>
希望这有助于:)