Python|判断一个字符串是否是IP地址

代码

import unittest

from ddt import data, unpack, ddt
import re


class IP:
    def isIpVsAddrLegal(self,ipStr):
        # 判断字符串中有没有.
        if . not in ipStr:
            return False

        ip_split_list = ipStr.strip().split(.)

        if len(ip_split_list) != 4:
            return False
        for i in range(4):
            try:
                ip_split_list[i] = int(ip_split_list[i])
            except:
                print(IP invalid for not number: + ipStr)
                exit()

            if 255 >= ip_split_list[i] >= 0:
                pass
            else:
                print(IP invalid: + ipStr)
                return False

        if int(ip_split_list[0] == 0):
            print(IP format wrong)
            exit()

        return True

    def check_ip(self,ipAddr):
        compile_ip = re.compile(^(1d{2}|2[0-4]d|25[0-5]|[1-9]d|[1-9]).(1d{2}|2[0-4]d|25[0-5]|[1-9]d|d).(1d{2}|2[0-4]d|25[0-5]|[1-9]d|d).(1d{2}|2[0-4]d|25[0-5]|[1-9]d|d)$)
        if compile_ip.match(ipAddr):
            return True
        else:
            return False

@ddt
class TestIp(unittest.TestCase):

    
    #@unpack
    def test_IP_Legal(self,ip_list):
        ip = IP()
        print(ip.isIpVsAddrLegal(ip_list))
    
    @data(
        [11.31.137.251],[.],[aa.11.23]
    )
    @unpack
    def test_IP_Legal(self,ip_list):
        ip = IP()
        print(ip.check_ip(ip_list))


if __name__ == __main__:
    unittest.main()

代码中用到的函数和用法分析

strip()

用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列

str.strip([chars]); #chars 移除字符串头尾指定的字符序列

split()

通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串

str.split(str=“”, num=string.count(str)). str 分隔符 num 分割次数

import re

re模块称为正则表达式

预定义字符:

d 匹配所有的十进制数字 0-9 D 匹配所有的非数字,包含下划线 s 匹配所有空白字符(空格、TAB等) S 匹配所有非空白字符,包含下划线 w 匹配所有字母、汉字、数字 a-z A-Z 0-9 W 匹配所有非字母、汉字、数字,包含下划线

特殊字符

1、$:匹配一行的结尾(必须放在正则表达式最后面) 2、^:匹配一行的开头(必须放在正则表达式最前面) 3、*:前面的字符可以出现0次或多次(0~无限) 4、+:前面的字符可以出现1次或多次(1~无限) 5、?:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次 6、.:匹配除了换行符" "之外的任意单个字符 7、|:两项都进行匹配 8、[ ]:代表一个集合,有如下三种情况 [abc]:能匹配其中的单个字符 [a-z0-9]:能匹配指定范围的字符,可取反(在最前面加入^) [2-9] [1-3]:能够做组合匹配 9、{ }:用于标记前面的字符出现的频率,有如下情况: {n,m}:代表前面字符最少出现n次,最多出现m次 {n,}:代表前面字符最少出现n次,最多不受限制 {,m}:代表前面字符最多出现n次,最少不受限制 {n}:前面的字符必须出现n次

匹配方法

1、match:在目标文本的开头进行匹配

find = re.math(hello, str1)       # 匹配成功返回匹配对象hello,不成功返回None

2、search:在整个目标文本中进行匹配

3、findall:扫描整个目标文本,返回所有与规则匹配的子串组成的列表,如果没有匹配的返回空列表

4、finditer:扫描整个目标文本,返回所有与规则匹配的子串组成的迭代器

5、fullmatch:要求目标文本要完全匹配规则,否则返回None

6、sub:将与规则匹配的子串替换为其他文本

str1 = re.sub(w+, aaa, str, count=0)       # count默认为0,表示全部替换

7、split:从与规则匹配的子串进行切割,返回切割后子串组成的列表

经验分享 程序员 微信小程序 职场和发展