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

Python|判断一个字符串是否是IP地址,第1张

代码
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('^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{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、.:匹配除了换行符"\n"之外的任意单个字符

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:从与规则匹配的子串进行切割,返回切割后子串组成的列表

参考文章
https://www.jb51.net/article/223741.htm
https://zhuanlan.zhihu.com/p/344932104

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/915858.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存