如何替换字符串中的令牌对?

时间:2011-03-16 20:45:48

标签: python regex token

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,blah,blah,blah来完成,但我没有写软件,我只是在逆转它的输出!

3 个答案:

答案 0 :(得分:7)

也许这样的事情会有所帮助:

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()

答案 1 :(得分:0)

使用sed:

s/\/([biu])([^/]\+)\/\1/<\1>\2<\/\1>/g

答案 2 :(得分:0)

一个非常简单的解决方案是使用源标记'/ b'拆分字符串,并使用新目标标记''重新加入子字符串数组,如下所示:

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

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