0

我需要匹配两种格式,例如:user:pass@112.213.123.12:3847111.23.123.78:2938,你是怎么做到的(仅匹配有效代理)?

顺便说一句,python中是否已经有这样的模块(验证代理格式)?

4

4 回答 4

2

我不确定 Python 中是否已经存在用于验证的包。

但是,您可以使用匹配正确格式的正则表达式,但不会验证 IP 是否是有效的 IP4 地址:

^(?:(\w+)(?::(\w+))?@)?((?:\d{1,3})(?:\.\d{1,3}){3})(?::(\d{1,5}))?$

它还将单独捕获用户、密码、ip 和端口

积极的方面:

user:pass@112.213.123.12:3847
user@112.213.123.12:3847
10.10.0.1:1024
111.23.123.78:2938
10.124.0.1
0.0.0.0

正则表达式无法识别 IP4 地址是否有效:

10.20.456.123

否定:

10.100.1
:user@10.124.10.1
user:@10.100.1.0:100

正则表达式经过测试http://www.rubular.com/r/jErO9xqDS2

于 2013-08-31T08:31:06.170 回答
0

通过验证:

import re

samples = [
    'user:pass@123.123.123.123:1234',
    '123.123.123.123:1234',
    '123.123.123:123',
    '321.123.123.123',
    '123.123.123.123:123123']

def isValidUser(name):
    return re.match('\w+', name) != None

def isValidPass(passwd):
    return isValidUser(passwd)

def isValidIp(ip):
    if ip.count('.') != 3:
        return False
    else:
        valid = True
        for i in ip.split('.'):
            try:
                if 0 <= int(i) <= 255:
                    pass
                else:
                    valid = False
            except ValueError:
                return False
        return valid

def isValidPort(port):
    valid = False
    try:
        if 0 < int(port) < 2**16:
            valid = True
    except ValueError:
        return False
    return valid

def isValidProxy(proxy):
    m = re.match('^((([^:]+):([^@]+))@)?((\d{1,3}\.){3}\d{1,3})(:(\d{1,5}))?$', proxy)
    if m is None:
        return False
    user = m.group(3) or 'user'
    passwd = m.group(4) or 'pass'
    ip = m.group(5)
    port = m.group(8) or '1234'

    return isValidUser(user) and isValidPass(passwd) and isValidIp(ip) and isValidPort(port)

for n in samples:
    print isValidProxy(n)

我认为端口是可选的。如果您需要更改端口:

    port = m.group(8) or '1234'

    port = m.group(8)

和/或改变:

    m = re.match('^((([^:]+):([^@]+))@)?((\d{1,3}\.){3}\d{1,3})(:(\d{1,5}))?$', proxy)

    m = re.match('^((([^:]+):([^@]+))@)?((\d{1,3}\.){3}\d{1,3})(:(\d{1,5}))$', proxy)
于 2013-08-31T08:38:00.543 回答
0

已编辑: 使用google-url (GURL) C++ 库来解析和验证 url。Python 包装器。

于 2013-08-31T08:45:49.693 回答
0

我目前用于仅接受 http / https 的解决方案,用户名:密码可选,主机作为 IP 或域名如下:

^(?:https?:\/\/)(?:(\w+)(?::(\w*))@)?([a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})|((?:\d{1,3})(?:\.\d{1,3}){3}))(?::(\d{1,5}))$

我希望它有帮助

于 2020-04-03T12:50:14.440 回答