gpt4 book ai didi

python - 如何使用正则表达式查找所有 Markdown 链接?

转载 作者:太空狗 更新时间:2023-10-29 21:01:00 29 4
gpt4 key购买 nike

在 Markdown 中有两种放置链接的方法,一种是直接输入原始链接,例如:<a href="http://example.com" rel="noreferrer noopener nofollow">http://example.com</a> , 另一个是使用 ()[]语法:(Stack Overflow)[<a href="http://example.com" rel="noreferrer noopener nofollow">http://example.com</a> ] .

我正在尝试编写一个可以匹配这两个的正则表达式,并且,如果它是第二个匹配项,则还捕获显示字符串。

到目前为止我有这个:

(?P<href>http://(?:www\.)?\S+.com)|(?<=\((.*)\)\[)((?P=href))(?=\])

Regular expression visualization

Debuggex Demo

但这似乎与我在 Debuggex 中的两个测试用例都不匹配:

http://example.com
(Example)[http://example.com]

真的不确定为什么第一个至少不匹配,这与我使用命名组有关吗?如果可能的话,我想继续使用它,因为这是一个匹配链接的简化表达式,在实际示例中,它太长了,我无法以相同的模式在两个不同的地方复制它。

我做错了什么?或者这根本不可行?

编辑:我在 Python 中执行此操作,因此将使用他们的正则表达式引擎。

最佳答案

您的模式不起作用的原因在这里:(?<=\((.*)\)\[)因为 Python 的 re 模块不允许可变长度后视。

您可以使用 the new regex module of Python 以更方便的方式获得您想要的东西(因为相比之下 re 模块的功能很少)

示例:(?|(?<txt>(?<url>(?:ht|f)tps?://\S+(?<=\P{P})))|\(([^)]+)\)\[(\g<url>)\])

An online demo

图案细节:

(?|                                       # open a branch reset group
# first case there is only the url
(?<txt> # in this case, the text and the url
(?<url> # are the same
(?:ht|f)tps?://\S+(?<=\P{P})
)
)
| # OR
# the (text)[url] format
\( ([^)]+) \) # this group will be named "txt" too
\[ (\g<url>) \] # this one "url"
)

此模式使用分支重置功能 (?|...|...|...)这允许在交替中保留捕获组名称(或数字)。在模式中,由于 ?<txt>分组首先在交替的第一个成员中打开,第二个成员中的第一个组将自动具有相同的名称。 ?<url> 相同组。

\g<url>是对命名子模式的引用 ?<url> (就像一个别名,这样,就不需要在第二个成员中重写了。)

(?<=\P{P})检查 url 的最后一个字符是否不是标点符号(例如有助于避免结束方括号)。 (我不确定语法,可能是 \P{Punct} )

关于python - 如何使用正则表达式查找所有 Markdown 链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25109307/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com