我需要匹配以下两种格式:user:pass@112.213.123.12:3847
和111.23.123.78:2938
,你是如何做到的(仅匹配有效代理)?
顺便说一下,python中是否有这样的模块(验证代理格式)?
答案 0 :(得分:1)
我不确定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
答案 1 :(得分: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)
答案 2 :(得分:0)
<强>编辑:强> 使用google-url (GURL) C ++库来解析和验证url。 There是Python包装器。
答案 3 :(得分:0)
我当前用于仅接受http / https,用户名:password以及将主机作为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}))$
我希望对您有帮助