Python正则表达式如何匹配URL链接?完整模式

来源:菜鸟站长作者:小何头衔:草根站长
导读:本期聚焦于小伙伴创作的《Python正则表达式如何匹配URL链接?完整模式》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Python正则表达式如何匹配URL链接?完整模式》有用,将其分享出去将是对创作者最好的鼓励。

URL链接通常由协议、域名、端口、路径、查询参数、锚点等多个部分组成,要编写完整的匹配模式,需要先明确每个部分的特征,再逐步组合正则表达式规则。

Python正则表达式如何匹配URL链接?完整模式

URL的结构拆解

一个完整的URL通常包含以下核心部分,我们也可以根据需求调整匹配范围:

  • 协议部分:常见的有http、https、ftp等,后面跟随://
  • 域名部分:由字母、数字、点号、连字符组成,包含主域名和子域名
  • 端口部分:可选,以冒号开头,后面跟随数字
  • 路径部分:可选,以斜杠开头,包含多级路径,可包含字母、数字、下划线、斜杠、点号等字符
  • 查询参数部分:可选,以问号开头,包含键值对,键值对之间用&分隔
  • 锚点部分:可选,以#开头,后面跟随锚点标识

完整匹配URL的正则表达式编写

我们逐步编写每个部分的匹配规则,最后组合成完整表达式:

1. 协议部分匹配

协议部分支持常见的http、https、ftp,也可以扩展其他协议,规则为(?:https?|ftp)://,其中(?:)表示非捕获分组,不需要单独提取协议内容。

2. 域名部分匹配

域名由多个标签组成,每个标签以字母或数字开头和结尾,中间可包含连字符,标签之间用点号分隔,规则为(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?

3. 端口部分匹配

端口是可选的,以冒号开头,后面跟随1-5位数字,规则为(?::d{1,5})?

4. 路径部分匹配

路径以斜杠开头,可包含字母、数字、下划线、斜杠、点号、百分号(用于URL编码),规则为(?:/[a-zA-Z0-9_./%]*)?

5. 查询参数部分匹配

查询参数以问号开头,可包含字母、数字、下划线、等号、&、百分号等字符,规则为(?:?[a-zA-Z0-9_=&%]*)?

6. 锚点部分匹配

锚点以#开头,可包含字母、数字、下划线等字符,规则为(?:#[a-zA-Z0-9_]*)?

完整组合表达式

将以上所有部分组合,得到完整的URL匹配正则表达式:

import re

# 完整URL匹配正则表达式
url_pattern = r"""(?:https?|ftp)://(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?::d{1,5})?(?:/[a-zA-Z0-9_./%]*)?(?:?[a-zA-Z0-9_=&%]*)?(?:#[a-zA-Z0-9_]*)?"""

Python中使用正则表达式匹配URL

使用re模块的相关方法可以实现URL的提取和校验,以下是常见的使用场景示例:

1. 从文本中提取所有URL

使用re.findall()方法可以提取文本中所有符合规则的URL:

import re

text = """
欢迎访问我的博客,地址是https://www.ipipp.com/post/123,
也可以访问ftp://files.ipipp.com/data.zip下载资源,
测试地址:http://127.0.0.1:8080/path?name=test&age=18#top
"""

url_pattern = r"""(?:https?|ftp)://(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?::d{1,5})?(?:/[a-zA-Z0-9_./%]*)?(?:?[a-zA-Z0-9_=&%]*)?(?:#[a-zA-Z0-9_]*)?"""

# 提取所有URL
urls = re.findall(url_pattern, text)
for url in urls:
    print(url)

运行以上代码,会输出文本中的三个URL:

  • https://www.ipipp.com/post/123
  • ftp://files.ipipp.com/data.zip
  • http://127.0.0.1:8080/path?name=test&age=18#top

2. 校验单个字符串是否为合法URL

使用re.fullmatch()方法可以校验整个字符串是否符合URL规则:

import re

url_pattern = r"""(?:https?|ftp)://(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?::d{1,5})?(?:/[a-zA-Z0-9_./%]*)?(?:?[a-zA-Z0-9_=&%]*)?(?:#[a-zA-Z0-9_]*)?"""

test_urls = [
    "https://www.ipipp.com",
    "http://192.168.0.1",
    "ftp://user@ipipp.com/file",  # 注意:该表达式暂不支持用户名密码形式的URL
    "www.ipipp.com"  # 缺少协议,不匹配
]

for url in test_urls:
    if re.fullmatch(url_pattern, url):
        print(f"{url} 是合法URL")
    else:
        print(f"{url} 不是合法URL")

注意事项

  • 以上正则表达式覆盖了大部分常见URL场景,但如果遇到包含用户名密码、特殊符号的URL,可能需要根据实际情况调整规则
  • 正则匹配URL无法完全替代专业的URL解析库,如果需要解析URL的各个组成部分,建议使用urllib.parse模块
  • 如果只需要匹配特定域名的URL,可以在域名部分添加对应的域名规则,缩小匹配范围
正则表达式的匹配规则可以根据实际需求灵活调整,不需要完全照搬上述完整模式,比如如果不需要匹配ftp协议,可以去掉表达式中的ftp相关部分。

Python正则表达式URL匹配re模块修改时间:2026-07-06 07:48:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。