Python: заменить теги, но сохранить внутренний текст? - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть строка.

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

Я хочу заменить все экземпляры [[.]] на <b>.</b>, сохранив подстановочный текст, соответствующий .

Результат должен быть таким: "This is an <b>example</b> sentence. It is <b>awesome</b>. "

Я мог бы зайти и вручную заменить [[ на <b> и ]] на </b>, но имеет смысл простосделайте это сразу и сохраните текст между тегами.

Как мне это сделать?

Примечание: это для того, чтобы взять источник из базы данных и преобразовать его в HTML.Он должен имитировать синтаксис в стиле вики.В этом случае [[x]] приводит к выделению жирным шрифтом.

Ответы [ 5 ]

5 голосов
/ 21 ноября 2010

Вы можете просто использовать метод 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
3 голосов
/ 21 ноября 2010

Как насчет использования re.sub() и немного магии регулярного выражения:

import re
re.sub(r'\[\[(.*?)\]\]', r'<b>\1</b>', "This is an [[example]] sentence. It is [[awesome]]");
2 голосов
/ 21 ноября 2010

Этот код позволяет расширить список замен по желанию.

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>.
1 голос
/ 21 ноября 2010

... преимущество использования подхода регулярных выражений здесь может заключаться в том, что он предотвращает выполнение подстановок, когда в исходном тексте нет соответствующих пар [[ и ]].

Может быть важно, а может и нет.

0 голосов
/ 21 ноября 2010

Методы, предложенные другими авторами, безусловно, будут работать, однако я хотел бы отметить, что использование регулярных выражений для этой задачи приведет к значительному снижению производительности.

Приведенный вами пример можно решить так же, какхорошо используя нативные строковые операции 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
>>> 

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...