You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用validators库验证含方括号密码的URL失败如何解决?

方案1:合规的URL百分号编码(推荐,符合RFC标准)

按照RFC 3986规范,[、]属于URI保留字符,出现在用户名/密码段时需要先做百分号编码,编码后再使用validators校验即可通过,不需要修改库源码:
[ 编码为 %5B,] 编码为 %5D
示例代码:

import urllib.parse
import validators

def encode_url_userinfo(url):
    if "@" not in url:
        return url
    userinfo_part, host_part = url.rsplit("@", 1)
    scheme, userinfo = userinfo_part.split("://", 1)
    # 拆分用户名和密码
    if ":" in userinfo:
        user, pwd = userinfo.split(":", 1)
        # 编码密码中的特殊字符
        encoded_pwd = urllib.parse.quote(pwd)
        encoded_userinfo = f"{user}:{encoded_pwd}"
    else:
        encoded_userinfo = urllib.parse.quote(userinfo)
    return f"{scheme}://{encoded_userinfo}@{host_part}"

# 测试用例
raw_url = "https://p124_ddm028127:PN-[.d.g5(R{bK}[5ZLx,4~K*hHrSy32=q+@git.net/scm/sample-config.git"
processed_url = encode_url_userinfo(raw_url)
print(validators.url(processed_url)) # 输出True

该方案不需要修改第三方库代码,符合URI标准,兼容性最好。


方案2:修复正则写法(如果必须校验未编码的原始URL)

你之前修改正则不生效的核心原因是:方括号在正则字符集中的位置不对,]如果没有放在字符集的最开头,会被识别为字符集的结束标记,导致整个正则匹配逻辑异常。
正确的修改方式是把]放在密码段字符集的最开头,不需要额外转义即可正确识别,你可以基于validators的完整URL正则替换用户信息段规则,自行实现校验逻辑:

import re
import validators

# 提取validators 0.18.1的完整URL正则,仅修改用户信息段的密码规则
custom_url_re = re.compile(
    r"^"
    # 修复后的用户信息校验段
    r"(?:[-a-z\u00a1-\uffff0-9._~%!$&'()*+,;=:]+"
    r"(?::][-a-z0-9._~%!$&'()*+,;=:\[]*)?@)?"
    # 以下保持原库的域名/IP/路径等校验逻辑不变
    r"(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)"
    r"(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*"
    r"(?:\.[a-z\u00a1-\uffff]{2,})\.?"
    r"(?::\d{2,5})?"
    r"(?:/\S*)?"
    r"$", re.IGNORECASE
)

def custom_validate_url(url):
    return custom_url_re.match(url) is not None

也可以直接将validators库升级到最新版本,最新版已经修复了用户信息段特殊字符的匹配问题。


方案3:完善urllib.parse自定义校验

你之前写的urlparse校验逻辑过于宽松,大量非法URL也会通过,可补充校验规则适配业务需求:

from urllib.parse import urlparse

def validate_url(url, allowed_schemes=("http", "https", "git", "ssh")):
    try:
        result = urlparse(url)
        # 按需自定义校验规则
        if result.scheme not in allowed_schemes:
            return False
        if not result.netloc:
            return False
        # 可额外补充域名格式校验、端口范围校验等规则
        return True
    except ValueError:
        return False

该方案不需要依赖第三方validators库,灵活性最高,可根据业务需求自由调整校验规则。

内容的提问来源于stack exchange,提问作者Kaliyug Antagonist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 18:15:00