最近写的一个程序里要匹配IP地址和端口号,但是总是匹配不成功,看了好几遍规则时正确的呀,后拆开一个一个慢慢排查原因,才发现是手贱的加了^和$在开头和结尾,这两个符号分别匹配字符串的开头和结尾,但我用的是re.search这个函数,只写了IP和端口部分的正则表达式,前后没有加.*,当然匹配不上了。。。
下面是端口匹配的错误代码和修正版本:
# 错误形式
domain = 'http://jppost-aka.com:81/'
print(re.search('^:(\\d|([1-9]\\d{1,3})|'
'[1-5]\\d{4}|'
'6[0-4]\\d{3}|'
'65[0-4]\\d{2}|'
'655[0-2]\\d|'
'6553[0-5])$', domain, re.M))
# 正确形式
# 这里一定是由大到小的顺序,不然只能匹配出一部分(后面IP匹配同理,不再提示)
print('由小到大:')
print(re.search(':(\\d|[1-9]\\d{1,3}|'
'[1-5]\\d{4}|'
'6[0-4]\\d{3}|'
'65[0-4]\\d{2}|'
'655[0-2]\\d|'
'6553[0-5])', domain))
print('由大到小:')
print(re.search(':(6553[0-5]|'
'655[0-2]\\d|'
'65[0-4]\\d{2}|'
'6[0-4]\\d{3}|'
'[1-5]\\d{4}|'
'[1-9]\\d{1,3}|\\d)', domain))```
对应输出:
None
由小到大:
<re.Match object; span=(21, 23), match=':8'>
由大到小:
<re.Match object; span=(21, 24), match=':81'>
下面附上我的完整的IP/端口的正则表达式代码:
注:我的目的是把url/domain列表中的每一条进行识别,判断是否含有IP/端口,结果存到一个vector里面
def has_port(self):
vector = []
# 端口号范围:0~65535
# 一位:0~9 \d
# 两位:10~99 [1-9]\d
# 三位:100~999 [1-9]\d{2}
# 四位:1000~9999 [1-9]\d{3} 前4种情况合并为:\d|[1-9]\d{1,3}
# 五位:10000~59999 [1-5]\d{4}
# 五位:60000~64999 6[0-4]\d{3}
# 五位:65000~65499 65[0-4]\d{2}
# 五位:65500~65529 655[0-2]\d
# 五位:65530~65535 6553[0-5]
# [0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]
for domain in self.domain_list:
if re.search(':(6553[0-5]|'
'655[0-2]\\d|'
'65[0-4]\\d{2}|'
'6[0-4]\\d{3}|'
'[1-5]\\d{4}|'
'[1-9]\\d{1,3}|\\d)', domain) is not None:
vector.append(1)
else:
vector.append(0)
return vector
def has_ip(self):
vector = []
for domain in self.domain_list:
# ip地址格式:xxx.xxx.xxx.xxx,且每一段都是0~255,下面是某一段可能的情况
# 一位:0~9 \d
# 两位:10~99 [1-9]\d
# 前两种情况合并:0~99 [1-9]?\d
# 三位:100~199 1\d{2}
# 三位:200~249 2[0-4]\d
# 三位:250~255 25[0-5]
if re.search(
'^((25[0-5]|'
'2[0-4]\\d|'
'1\\d{2}|'
'[1-9]?\\d)\\.){3}'
'(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$', domain) is not None:
vector.append(1)
else:
vector.append(0)
return vector