为什么使用适当的协议捕获URL会失败?

2024-05-16 04:05:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始编写一个正则表达式,试图捕获尽可能多的URL。然而,由于某种原因,我不能让它工作

Regex:

^(https?|ftps?|mailto|gopher|telnet|www\.)\:.+?\/(?=\s)

演示:Regex101

感谢您的帮助。Thx提前


Tags: httpsurlwwwtelnetregexmailtogopherftps
2条回答

您的模式\/(?=\s)要求URL以斜杠结尾。您可以通过在测试代码段中任何URL的末尾添加斜杠来检查这一点

没有真正的理由这样做-您可以删除\/,并允许URL以任何后跟空格的字符结尾

但是,除此之外,您还应该注意空格的功能不是很强大。如果URL出现在文本中,则后面可能会有标点或括号,标点或括号在技术上是有效的URL字符,您的筛选器(减去\/)将包括这些字符,即使它们可能不是URL的一部分

在这些情况下,显然存在一些歧义,但在URL末尾排除任何标点符号可能是更好的启发

(如果你想变得真的老练,你可以像GitHub的markdown解析器那样,在的末尾加上右括号,只要它们与URL中的左括号匹配。这有助于识别像(See https://en.wikipedia.org/wiki/Something_(disambiguation))这样的上下文中的链接。但仅使用正则表达式是不可行的,需要一些额外的处理。)

你可以用

^(?:(?:https?|ftps?|gopher|telnet):\/\/|www\.|mailto:)\S+

regex demoits graph

enter image description here

详细信息

  • ^-字符串的开头
  • (?:(?:https?|ftps?|gopher|telnet):\/\/|www\.|mailto:)-任何一种
    • (?:https?|ftps?|gopher|telnet):\/\/-httphttpsftpftpsgophertelnet然后://子串
    • |-或
    • www\.-www.子串
    • |-或
    • mailto:-mailto:子串
  • \S+-1个或多个非空白字符

相关问题 更多 >