【问题标题】:Escape Characters in Regex sub of Markdown Links to HTML LinksMarkdown 链接到 HTML 链接的正则表达式子中的转义字符
【发布时间】:2019-11-23 02:28:40
【问题描述】:

我正在尝试转换以下内容的降价:

[Board Management](Boards/boardManagement.md)

使用 Python 处理类似的事情:

<a href='#' onclick='requestPage("Boards/boardManagement.md");'>Board Management</a>

我找到了如下 re.sub 的代码,但我可以让它工作的唯一方法是不在 requestPage 周围包含任何类型的引号,并且浏览器似乎会自动将它们放入...

 filteredPage = re.sub('\[(.+)\]\((.+)\)', r"<a href='#' onclick=requestPage('\2');>\1</a>", pageContent)

其中 pageContent 是降价。虽然它似乎有效,但似乎最好不要依赖浏览器进行自动插入,但每次我尝试用引号重写它时,它都不会产生正确的结果。例如,

filteredPage = re.sub('\[(.+)\]\((.+)\)', r"<a href='#' onclick=\"requestPage('\2');\">\1</a>", pageContent)

结果

<a href="#" onclick=\"requestPage('Boards/boardManagement.md');\">Board Management</a>

除了依赖浏览器之外,有没有办法在 onclick 函数周围加上引号来完成所需的链接?

【问题讨论】:

  • 最通用的解决方案可能是查看许多现有的 Python Markdown 实现并找到一个支持 onclick 属性的实现。例如,Python-Markdown 有一个 attribute lists 扩展名。
  • 感谢您的回复。我能够接受您的建议并使其发挥作用。但是,我不希望使用 html 属性来装饰 markdown 文档。降价来自我试图以某种方式从 python 应用程序中提供服务的 github pages 文档。我宁愿在 python 应用程序本身中完成所有处理,而不是依赖贡献者正确地完成所有装饰。我可以使用上面当前的解决方案,但只想知道是否有办法在引号内加上引号。

标签: python regex


【解决方案1】:

总结

您遇到的问题是,当您在原始字符串文字 (r"...") 中转义引号时,不会从字符串中删除反斜杠。要了解我的意思,请查看此代码输出的内容:

print( "abc \" def")  # abc " def    (the backslash is gone)
print(r"abc \" def")  # abc \" def   (the backslash is in the string)

在大多数情况下,解决方案是使用三引号字符串:

print( """abc \" def""") # abc " def   (this is the same as the first one)
print(r"""abc " def""" ) # abc " def   (this is how to get quotes in a raw string)

所以你的代码变成了这样:

re.sub(r'\[(.+)\]\((.+)\)',
       r"""<a href='#' onclick="requestPage('\2');">\1</a>""",
       pageContent)

另一种选择是使用' 作为您的字符串,并将href 属性放入":您可以使用r'&lt;a href="#" onclick="request..."&gt;' 之类的东西。

说明

理解原始字符串文字如何工作的关键可能是:如果您在原始字符串文字中使用反斜杠,它将包含在字符串中。

原始字符串文字只是 大部分 原始的。一个例外是引用。这使您可以在字符串中包含引号。但与常规字符串不同的是,如果您在原始字符串文字中转义引号,则反斜杠仍将在字符串中。

这是在the section on string literals的最后一段指定的:

即使在原始文字中,引号也可以用反斜杠转义,但反斜杠仍保留在结果中;例如,r"\"" 是由两个字符组成的有效字符串文字:反斜杠和双引号

您的问题的解决方案是使用三引号原始字符串文字而不是转义引号,如上所示。

在更极端的情况下,您可以使用string literal concatenation 来帮助转义字符串,但这可能不是一个好的用例。我只会在 (a) 字符串需要同时包含 """''' 时使用它,或者 (b) 我已经出于其他原因使用字符串文字连接(例如将长字符串拆分为多行)。


最后一件事:您应该为您的正则表达式使用原始字符串文字。对于您在这里的正则表达式来说,这不是必需的,但它使编写(和读取)正则表达式变得更加容易,因为每个反斜杠始终在字符串中,因此您可以准确地阅读正则表达式引擎将读取。

更重要的是,无法识别的转义序列(包括\(\[)将被逐步淘汰,最终会引发SyntaxError,因此如果您希望您的代码继续在尽可能多的未来版本的Python 中工作可能,将您的正则表达式放在原始文字中。

【讨论】:

  • 我还是一头雾水,但我将字符串分解成一堆更小的字符串,并使用字符串文字连接将其拼凑在一起。它有效,这很重要:
  • @madgrizzle 我添加了一个摘要部分,并且通常重新编写了很多答案,以使其更清晰、更集中。我还为您提供了一个实际的解决方案(请不要为此使用字符串文字连接,这很难阅读)。
  • 非常感谢。这为我澄清了(现在对我来说很明显你的意思)。至于你关于逐步淘汰无法识别的转义序列的告别词,你能指出我在某个地方阅读吗?
  • @madgrizzle 这是Section 2.4.1最后一段之前的通知。一旦发生这种变化,将只允许第 2.4.1 节中的表中的转义序列。这个过程从this Python issue 开始,其中包含对他们为什么这样做的讨论(以及一些最初的消息链接到之前的讨论)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
相关资源
最近更新 更多