在python中简单的递归字符串替换?

时间:2011-11-26 12:32:12

标签: python regex string

我正在尝试用Python中的另一个字符串递归替换字符串。我知道this线程,但来自其他语言我很惊讶 - 它真的那么难吗?有没有办法使用单线程来做到这一点?

astring="<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>"

tweaked = re.sub(r"\*",r"</a>", astring)

我认为r意味着递归,但它似乎没有在这里做到。简单的替换真的很难吗?

我已经尝试了string.replace - 这不起作用,我认为它可能是换行符吗?然后我尝试了string.translate,它在替换字符串中需要相同数量的字符,这对于此示例并不适用,并且代码行太多。我尝试了很多这个版本,我做错了什么?

也许我误解了递归?我认为这意味着“不是一场比赛,一直到最后”?我想替换* with the </a>astring部分只是一个例子而不是我试图替换的实际字符串,因为它很大。 (也请原谅我的新闻)

请将这个问题投给罢免

3 个答案:

答案 0 :(得分:2)

有几点需要注意:

  1. 该字符串不是有效的python语法。它由单个双引号定义,但其中有双引号。使用单引号str = 'blah blah'定义字符串或使用三引号str = """blah blah"""

  2. strbuilt-in function的名称。最好不要覆盖内置插件(尽管允许)。

  3. r""定义了“原始字符串”。请参阅docs

  4. re.sub()会替换字符串中所有非重叠的匹配序列,这就是您想要的。在简单的情况下,应首选string.replace(),例如mystring.replace('*', '</a>')。请参阅docs

  5. 鉴于这些要点,这段代码:

    import re
    
    mystring = '''<li><a href="#Quick Start">Quick Start*</li></li>
    <li><a href="#Parsing a Document">Parsing a Document*</li></li>
    <ul>
    <li><a href="#Parsing HTML">Parsing HTML*</li></li>
    <li><a href="#Parsing XML">Parsing XML*</li></li>'''
    
    mynewstring = re.sub(r'\*', '</a>', mystring)
    print(mynewstring)
    

    将产生以下输出:

    <li><a href="#Quick Start">Quick Start</a></li></li>
    <li><a href="#Parsing a Document">Parsing a Document</a></li></li>
    <ul>
    <li><a href="#Parsing HTML">Parsing HTML</a></li></li>
    <li><a href="#Parsing XML">Parsing XML</a></li></li>
    

    请注意,替换字符串</a>中的正斜杠需要转义而不是。但是,模式'*' 需要进行转义才能使其成为有效的正则表达式。

答案 1 :(得分:1)

考虑到评论中的建议,这是一个可能的解决方案:

string = """<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>"""

string = string.replace("*", "</a>")
print string

答案 2 :(得分:1)

在Python中r''r""表示原始字符串。在原始字符串中,不进行反斜杠解释。

以下似乎效果很好:

foo="""<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>"""

foo = foo.replace('*', '</a>')