Как заменить пары токенов в строке? - PullRequest
6 голосов
/ 16 марта 2011

Новичок в python, хорошо владеет несколькими языками, но не может найти «шикарного» способа сделать следующее.Я уверен, что это кричит о регулярном выражении, но любое решение, которое я могу придумать (используя группы регулярных выражений, а что нет), становится безумным довольно быстро.

Итак, у меня есть строка с HTML-подобными тегами, которыеЯ хочу заменить реальными HTML-тегами.

Например:

Hello, my name is /bJane/b.

Должно стать:

Hello, my name is <b>Jane</b>.

Может быть комбинированным с [i] talicи также [u] nderline:

/iHello/i, my /uname/u is /b/i/uJane/b/i/u.

Должно стать:

<i>Hello</i>, my <u>name</u> is <b><i><u>Jane</b></i></u>.

Очевидно, что прямое str.replace не будет работать, потому что перед каждым вторым токеном должен стоять символ вперед.

Для ясности, если токены комбинируются, они всегда сначала открываются, сначала закрываются.

Большое спасибо!

PS: Я знаю, что прежде чем кто-то возбудитсячто такого рода вещи должны быть сделаны с помощью CSS, бла, бла, бла, но я не писал программное обеспечение, я просто изменил его вывод!

Ответы [ 3 ]

7 голосов
/ 17 марта 2011

Может быть, что-то подобное может помочь:

import re


def text2html(text):
    """ Convert a text in a certain format to html.

    Examples:
    >>> text2html('Hello, my name is /bJane/b')
    'Hello, my name is <b>Jane</b>'
    >>> text2html('/iHello/i, my /uname/u is /b/i/uJane/u/i/b')
    '<i>Hello</i>, my <u>name</u> is <b><i><u>Jane</u></i></b>'

    """

    elem = []

    def to_tag(match_obj):
        match = match_obj.group(0)
        if match in elem:
            elem.pop(elem.index(match))
            return "</{0}>".format(match[1])
        else:
            elem.append(match)
            return "<{0}>".format(match[1])

    return re.sub(r'/.', to_tag, text)

if __name__ == "__main__":
    import doctest
    doctest.testmod()
0 голосов
/ 17 марта 2011

Очень простым решением было бы разделить строку с помощью исходного тега '/ b' и воссоединить массив подстроки с новым целевым тегом '', например так:

s = "Hello, my name is /bJane/b."
'<b>'.join(s.split('/b'))
print s

'Hello, my name is <b>Jane<b>.'
0 голосов
/ 16 марта 2011

с седом:

s/\/([biu])([^/]\+)\/\1/<\1>\2<\/\1>/g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...