学习python-Day23


今日学习内容

一、正则前戏

  1. 简介:该知识点不属于任何一门语言,是一个独立的学科,主要用于数据的查找与筛选。

  2. 前戏:编写代码校验用户输入的手机是否合法。

    常见  13  15  17  18  19
    纯python代码逻辑实现
    #获取手机号码
    phone_num = input('请输入手机号码>>>:').strip()
    #判断用户输入的手机号码是否是纯数字
    if phone_num.isdigit():
        #判断总长度是否是11位
        if len(phone_num) == 11:
            #判断是否以常见号码开头
            if phone_num.startswith('13') or phone_num.startswith('15')
                    or phone_num.startswith('17') or 				phone_num.startswith('18') 
                    or phone_num.startswith('19'):
                phone_num = input(phone_num)
                print(phone_num)
            else:
                print('号码不合法!')
        else:
            print('号码长度不规范!')
    else:
        print('号码必须纯数字!')
        
        
        
    '''正则表达式实现'''
    import re
    phone_num = input('把你的手机号码高数我>>>:').strip()
    if re.match('^[13|15|17|18|19][0-9]{9}',phone_num):
        print(phone_num)
    else:
        print('输入不合法!')
        
    
    
  3. 总结
    正则表达式本质上就是使用一些符号的组合产生一些特殊的含义
    然后去字符串选出符合条件的数据。

二、正则表达式之字符组

  1. 正则表达式线上测试网址:http://tool.chinaz.com/regex/

  2. 字符组在没有量词修饰的情况一次只针对一个数据值

    [0-9] 匹配到 0 - 9之间的任意一个数字(包括0和9)
    
    字符组 含义 举例
    [0-9] 匹配到0到9的任意一个数字(包括0和9) 全称是:[0123456789]
    [A-Z] 匹配A到Z之间的任意一个字母(包括A和Z) 全称是:[ABC...XYZ]
    [a-z] 匹配a到z之间的任意一个字母(包括a和z) 全称:[abc...xyz]
    [0-9a-zA-Z] 在中括号内编写的多个数据值
    彼此都是或的关系。
    数字、小写字母、大写字母都可以

三、正则表达式之特殊符号

  1. 特殊符号在没有量词修饰的情况下一个符号一次只会针对一个数据值。

    特殊符号 含义
    . 匹配除换行符以外的任意字符
    \w 匹配字母或数字或下划线
    \W 匹配非字母或数字或下划线
    \d 匹配数字
    ^ 匹配字符串的开头
    $ 匹配字符串的结尾 ^与\(的组合能够明确的限制想要查找的具体数据 ^9\)
    a|b 匹配字符a或字符b 管道符|在很多场景下的意思都是或
    () 给正则表达式分组,不影响表达式匹配 用于后续的正则起别名,分组获取对应数据
    []
    [^]
    匹配字符组中的字符
    匹配除了字符组中字符的所有字符

四、正则表达式之量词

  1. 在正则表达式中所有的量词默认丢失贪婪匹配(尽可能多的)

  2. 量词不能单独使用,必须要在表达式后面,并且只能影响紧挨着的左边那一个

    量词 含义
    * 重复0次或者更多次(默认就是尽可能多)
    + 重复一次或者更多次(默认就是尽可能多)
    ? 重复0次或者一次(默认就是一次)
    {n} 重复n次
    {n,} 重复n次或者更多次
    {n,m} 重复n到m次

五、正则表达式之练习题

正则表达式(. ^ $) 待匹配字符 结果
海. 海燕海娇海东 海燕海娇海东
^海. 海燕海娇海东 海燕
海.$ 海燕海娇海东 海东

正则表达式(* + ? {}) 待匹配字符 结果
李.? 李杰和李莲英和李二棍子 李杰
李莲
李二
李.* 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
李.+ 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
李.{1,2} 李杰和李莲英和李二棍子 李杰和
李莲英
李二棍

惰性匹配

正则表达式(* + ? {}) 待匹配字符 结果
李.*? 李杰和李莲英和李二棍子


正则表达式([][^]) 待匹配字符 结果
李[杰莲英二棍子]* 李杰和李莲英和李二棍子 李杰
李莲英
李二棍子
李[^和]* 李杰和李莲英和李二棍子 李杰
李莲英
李二棍子
[\d] 456bdha3 4
5
6
3
[\d]+ 456bdha3 456
3

六、正则表达式之贪婪与非贪婪

待匹配的文本:
正则表达式:<.*>  #贪婪匹配
上述正则匹配出来的内容是:
正则表达式:<.*?>  #非贪婪匹配
上述正则匹配出来的内容是:

1.技巧:我们在使用贪婪匹配或者非贪婪匹配的时候都是用 .* 或者.*? 。并且结束的标志有上述符号左右两边添加的表达式决定。

七、正则表达式之取消转义

  1. 正则表达式中取消斜杠与字母的特殊含义 :在斜杠前面加斜杠

  2. python 中简便取消转义写法:r'\n'

八、正则表达式之实战建议

常见的正则百度查找,然后修改一下就好。

编写校验用户手机号的正则
	0?(13|14|15|17|18|19)[0-9]{9}
编写校验用户身份证的正则
	\d{17}[\d|x]|\d{15}
编写校验用户邮箱的正则
	\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
编写校验用户qq号的正则
	[1-9]([0-9]{5,11})