如何用正则表达式精准提取文本中的超链接? 直接上手写正则提取超链接,最容易踩的坑就是“以为看见网址就能匹配”——实际上,纯文本里混着邮箱地址、JavaScript伪协议、甚至是标点符号末尾的残缺URL,分分钟让结果跑偏。真正的关键,不在于“找网址”,而在于“识别哪一段是真实可跳转的链接结构”。下面这
如何用正则提取文本中的所有超链接?
作者:技术拾光
时间:2026-07-06
浏览:604
文章目录
如何用正则表达式精准提取文本中的超链接?
直接上手写正则提取超链接,最容易踩的坑就是“以为看见网址就能匹配”——实际上,纯文本里混着邮箱地址、JavaScript伪协议、甚至是标点符号末尾的残缺URL,分分钟让结果跑偏。真正的关键,不在于“找网址”,而在于“识别哪一段是真实可跳转的链接结构”。下面这几个正则表达式模式,基本覆盖了你能遇到的绝大多数场景。

匹配协议开头的完整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>]*'(排除邮箱等干扰)
- 如果需要一并提取
src、data-url等属性,可用统一模式:r'(?:href|src|data-url)s*=s*["']?([^"'s>]+)'
提取后记得简单清洗
正则提取的是原始字符串,后续建议做这几步再用:
- 用
strip()去掉首尾空白或多余符号(比如逗号、括号)。 - 过滤掉
javascript:、mailto:、tel:这类非页面跳转链接。 - 对相对路径(如
/about或./img.png),若需转成绝对地址,得结合原始网页 base URL 拼接。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。