网址匹配正则表达式(python 实现)
在实际开发中,直接接收用户输入的链接往往存在安全隐患,因此对 URL 进行格式校验是必不可少的一环。
核心思路
构建一个通用的正则表达式需要覆盖几个关键点:协议头、域名结构、端口以及路径。虽然 RFC 标准非常复杂,但在工程实践中,我们通常采用一种兼顾兼容性与性能的简化方案。
代码实现
import re
# 编译正则对象,提高重复匹配效率
url_regex = re.compile(
r'^https?://' # 支持 http 和 https
r'(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+' # 域名主体
r'[A-Z]{2,6}\.?|' # 顶级域名
r'localhost' # 本地主机
r'(?::\d+)?' # 可选端口
r'(?:/?|[/?]\S+)?$', # 路径与查询参数
re.IGNORECASE
)
def is_valid_url(url):
return bool(url_regex.match(url))
这段代码将正则预编译为对象,避免每次调用时的重复开销。re.IGNORECASE 标志让匹配不区分大小写,符合 URL 规范。
细节说明
注意看域名部分的 (?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+,这里限制了子域名的长度,防止过长的无效输入。对于 localhost 这种特殊情况单独列出,方便本地调试环境识别。
实际运行时,如果遇到国际域名或更复杂的 IP 地址,可能需要引入第三方库如 validators 来辅助校验,但上述正则已能满足绝大多数业务场景的需求。
总结
通过预编译正则对象,我们可以在保证准确性的同时获得更好的性能。根据具体业务需求调整正则范围,即可灵活适配不同的 URL 校验场景。


