邮件URL中的RegexMatch密码

2024-05-28 23:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个SMTP/IMAP/POP3登录URL:

smtp://foobar@example.com:abc@smtp.example.com:465

我想将密码(abc在本例中是abc)替换为一个固定数目的星(例如*****),以便对用户隐藏它。在

到目前为止,我所尝试的大量使用了环视法:

^{pr2}$

不幸的是,此正则表达式有几个问题,包括:

  • 第一个单元测试成功,但是第二个单元测试没有成功,因为协议(smtp://冒号是匹配的)。我尝试了(?<=\w+://\w+:),但是lookbehind需要是自定义长度。也许我可以使用这些URL部分并用\1*****\2)或类似的东西来替换?在
  • 包含@和/或{}的密码将无法识别,我甚至不确定它们是如何被转义的(这就是为什么我不使用non-greedy标志)

请注意,我不能使用Python3(urlparse模块)——而且我也不想使用第三方库,除非绝对必要。在

提前感谢你给我指出了正确的方向。在


Tags: 用户comurl密码example单元测试smtpfoobar
2条回答

使用此正则表达式:

(?<=:)([^@:]+)(?=@[^@]+$)

我将:添加到[^@]。因此,此正则表达式将匹配:和{}之间的字符串,中间没有{}或{}。在

^{pr2}$

您可以使用^{} function(这在Python 2中也可用);.netloc参数将包含用户名和密码(这两个都将被转义以不包含普通的:或{}字符,请参见RFC 3986 Section 3.2.1):

import urlparse

def starPassword(route):
    parsed = urlparse.urlsplit(route)
    if '@' not in parsed.netloc:
        return route

    userinfo, _, location = parsed.netloc.partition('@')
    username, _, password = userinfo.partition(':')
    if not password:
        return route

    userinfo = ':'.join([username, '*****'])
    netloc = '@'.join([userinfo, location])
    parsed = parsed._replace(netloc=netloc)
    return urlparse.urlunsplit(parsed)

演示:

^{pr2}$

相关问题 更多 >

    热门问题