我需要匹配两种格式,例如:user:pass@112.213.123.12:3847
和111.23.123.78:2938
,你是怎么做到的(仅匹配有效代理)?
顺便说一句,python中是否已经有这样的模块(验证代理格式)?
我不确定 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
通过验证:
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)
已编辑: 使用google-url (GURL) C++ 库来解析和验证 url。有Python 包装器。
我目前用于仅接受 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}))$
我希望它有帮助