正则表达式匹配IP和端口号:不能正确匹配的一种可能原因

最近写的一个程序里要匹配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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值