Python string.replace不替换

时间:2015-05-23 06:10:47

标签: python python-2.7 replace markdown

我有以下代码。

    def render_markdown(markdown):
        "Replaces markdown links with plain text"
        # non greedy
        # also includes images
        RE_ANCHOR = re.compile(r"\[[^\[]*?\]\(.+?\)")
        # create a mapping
        mapping = load_mapping()
        anchors = RE_ANCHOR.findall(markdown)
        counter = -1
        while len(anchors) != 0:
            for link in anchors:
                counter += 1
                text, href = link.split('](')[:2]
                text = '-=-' + text[1:] + '-=-'
                text = text.replace(' ', '_') + '_' + str(counter)
                href = href[: -1]
                mapping[text] = href
                markdown = markdown.replace(link, text)
                anchors = RE_ANCHOR.findall(markdown)
        return markdown, mapping

但是降价功能不会替换所有链接。几乎没有人被替换。我环顾四周,发现了很多与此相关的问题。发现的问题属于以下类型:

    abc.replace(x, y) instead of abc = abc.replace(x, y)

我这样做但字符串没有被替换

2 个答案:

答案 0 :(得分:1)

看起来原因是你的正则表达式与你期望的文本不匹配。所以循环是空的。

尝试发布一些示例降价,运行代码并添加 print 语句,以便您可以查看所有中间结果(尤其是锚点列表)。有了这些,调试将更容易: - )

答案 1 :(得分:0)

当您使用正则表达式时,我不明白您使用replace的原因。 re库为您提供了执行所需操作的工具,而无需定位字符串两次(一次使用正则表达式,一次使用replace)。

例如,MatchObject包含匹配文本的start and end个位置。您可以使用文本切片来执行自己的字符串替换。但即使这样也是不必要的,因为您可以使用re.sub并让re库在找到匹配项时替换您。您只需要定义一个可接受MathObject的callable并返回替换它的文本。

def render_markdown(markdown):
    "Replaces markdown links with plain text"

    RE_ANCHOR = re.compile(r"\[[^\[]*?\]\(.+?\)")

    mapping = load_mapping()

    def replace_link(m):
        # process your link here...
        mapping[text] = href
        return text

    return RE_ANCHOR.sub(replace_link, markdown)

如果您想对正则表达式添加一些内容,可以让正则表达式将链接分解为可以作为匹配对象上的组访问的部分。例如:

RE_ANCHOR = re.compile(r"\[([^\[]*?)\]\((.+?)\)")

# ...

text = m.group(1)
link = m.group(2)

我所做的就是在每个文本和链接(括号内)周围添加一组括号。虽然,我希望你的正则表达式不够复杂,无法匹配Markdown文档中找到的所有可能的链接。例如,Python-Markdown库允许在" text"中包含至少六个级别的嵌套括号。链接的一部分。并且不要忘记链接中定义的标题(如(url "title"))。但这只是表面上的问题。此外,这将是一个单独的问题。