【问题标题】:Python string.replace does not replacePython string.replace 不替换
【发布时间】:2015-08-05 05:35:14
【问题描述】:

我有以下代码。

    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

但是,markdown 函数不会替换所有链接。几乎没有一个被替换。我环顾四周,发现了很多与此有关的问题。发现的问题属于以下类型:

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

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

【问题讨论】:

  • 你能举一个你期望发生的例子吗?
  • 你为什么不使用many markdown libraries 来准备安装?
  • @kindall 这是一种自我教育。因此,我正在从头开始构建。我期待search 被替换为 -=-search-=-

标签: python python-2.7 replace markdown


【解决方案1】:

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

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

【讨论】:

  • 我已经通过在函数中添加打印语句进行了验证。正则表达式按预期找到了每个链接。但是,替换函数的返回值与提供的原始值相同。这并不一致。有时它会取代有时它不会。有什么想法吗?
  • 如果你不发布你的样本数据和预期的输出,很难给你有意义的帮助。 replace(old, new) 没有替换任何东西的通常原因是 old 没有完全匹配。
【解决方案2】:

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

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

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 库允许在链接的“文本”部分内至少有六层嵌套括号。并且不要忘记链接中定义的标题(如(url "title"))。但这只是表面问题。此外,这将是一个单独的问题。

【讨论】:

  • 谢谢。您对嵌套括号是正确的。我最终会找到他们。截至目前,我已更改代码以使用您描述的方式。但是我仍然不明白为什么没有发生替换。除非我的代码有缺陷,否则逻辑非常清晰明确。唯一的缺点是效率不高。无论如何感谢您的帮助。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2021-05-20
  • 2011-05-20
  • 2016-01-15
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多