如何使用正则提取一段话中所有的超链接?

作者:袖梨 2026-07-01
应优先用正则r'https?://[^s"'<>'']+匹配协议开头的真实URL,再扩展支持HTML的href属性、协议相对URL(//)、根相对路径(/)及src等属性,提取后需清洗并过滤伪协议。

直接用正则提取一段话里的超链接,关键不是“找网址”,而是“识别真实可跳转的链接结构”。纯文本中混杂的 URL 可能是邮箱、假链接、JS 伪协议,得靠模式设计来过滤。

匹配协议开头的完整URL

这是最常用也最稳妥的方式,适用于 http、https 开头的链接:

  • r'https?://[^s"']+' ——匹配以 http 或 https 开头、直到空格或常见分隔符(引号、尖括号)为止的字符串
  • 它自动避开后面跟着的标点,比如 https://example.com. 中的句号不会被包含进去
  • 注意:不处理编码字符(如 %20),但日常文本基本够用;如需更严谨,可扩展为支持百分号编码的版本

兼容 href 属性里的链接

如果这段话其实是 HTML 片段(比如从网页源码里截出来的一段),那重点是抓 href 的值:

  • r'href=["']([^"']+)["']'——同时支持单引号和双引号包裹的 URL
  • 捕获组 ([^"']+) 确保只取引号内的内容,不会跨标签误吞
  • 如果还可能遇到无引号写法(如 href=/about),可升级为:r'hrefs*=s*["']?([^"'>s]+)'

覆盖更多常见链接类型

实际文本中还有不少非 http 开头但仍是有效链接的地址:

  • //cdn.example.com/js/app.js(协议相对 URL)→ 匹配 r'//[^"'s>]+ '
  • /api/v1/data(根相对路径)→ 匹配 r'/(?![a-zA-Z@-])[^"'s>]*'(排除邮箱等干扰)
  • 如果需要一并提取 srcdata-url 等属性,可用统一模式:r'(?:href|src|data-url)s*=s*["']?([^"'s>]+)'

提取后记得简单清洗

正则提取的是原始字符串,后续建议做这几步再用:

  • strip() 去掉首尾空白或多余符号(比如逗号、括号)
  • 过滤掉 javascript:mailto:tel: 这类非页面跳转链接
  • 对相对路径(如 /about./img.png),若需转成绝对地址,得结合原始网页 base URL 拼接

相关文章

精彩推荐