如何替换字符串中的成对标记?

6 投票
3 回答
1788 浏览
提问于 2025-04-16 13:51

我刚接触Python,之前会几种编程语言,但对以下问题没有找到一个“炫酷”的解决办法。我知道这可能需要用到正则表达式,但我尝试的任何方法(用正则表达式的分组等)都变得复杂得让人抓狂。

我有一个字符串,里面有类似HTML的标签,我想把这些标签替换成真正的HTML标签。

比如说:

Hello, my name is /bJane/b.

应该变成:

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

它可能还会和 [i]斜体 和 [u]下划线组合在一起:

/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 个回答

0

一个非常简单的解决办法是用源标签'/b'来分割字符串,然后用新的目标标签''把分割后的数组重新连接起来,像这样:

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

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

使用sed命令:

s/\/([biu])([^/]\+)\/\1/<\1>\2<\/\1>/g
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()

撰写回答