正则表达式

内容概要

  • 正则表达式的前戏
  • 字符组
  • 特殊符号
  • 正则表达式量词
  • 贪婪匹配和非贪婪匹配
  • 取消转义
  • re模块

 

正则表达式前戏


  # 功能获取用户注册的手机号
  '''普通写法'''

    # 获取用户手机号
    user_phone = input('your mobile phone number>>>:').strip()
    # 输入的数字是否11位
    while len(user_phone) == 11:
        # 验证手机号码是否纯数字
        if user_phone.isdigit():
            # 检验开头是否合法
            if user_phone.startswith('13') or user_phone.startswith('15') or \
                    user_phone.startswith('18') or user_phone.startswith('19'):
                print('电话号码检验成功!')
                break
            else:
                print('电话号码不合法!')
                break
        else:
            print('电话号码必须纯数字!')
            break
    else:
        print('电话号码必须11位!')


    '''正则表达式'''
    import re
    user_phone = input('your phone>>>:').strip()
    if re.match('^(13|15|18|19)\d{9}$', user_phone):
        print('电话验证成功!')
    else:
        print('电话不存在或不合法!')

    """
    正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需的数据
    任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
    """
    用自己的话概括>>>:什么是正则表达式
      	利用一些'特殊符号'的组合去字符串中筛选出想要的数据

    在匹配筛选查找数据的时候可以使用正则提供的符号也可以直接写目标数据
    所以学习正则很大程度上就是在学习一些特殊符号的使用

正则表达式字符组

在线测试网站:http://tool.chinaz.com/regex/

    '''单个字符组默认一次只匹配一个字符'''        
字符组 匹配的字符
[0123456789] 匹配0到9之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字(简写)
[a-z] 匹配a到z之间的任意一个小写字母
[A-Z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z] 匹配任意一个数字或者大小写字母(没有顺序)

正则表达式之特殊符号

特殊符号 匹配字符
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线(后续筛选变量名可能用到)
\d 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
a管道符b 匹配a或者b 管道符就是or(或)的意思
( ) 给正则表达式分组 不影响正则匹配(后续再讲)
[ ] 字符组的概念(里面所有的数据都是或的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作

正则表达式量词

注意量词默认都是贪婪匹配(尽可能多的匹配)

"""量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数"""
量词 功能
* 重复零次或者多次(默认就是多次:越多越好)
+ 重复一次或者多次(默认就是多次:越多越好)
重复零次或者一次(默认就是一次:越多越好)
重复n次
重复最少n次最多多次(越多越好)
重复n到m次(越多越好)
正则表达式的使用
表达式 文本 结果
鲤. 鲤鱼红鲤鱼与绿鲤鱼 3条
^鲤 鲤鱼红鲤鱼与绿鲤鱼 1条
鲤.$ 鲤鱼红鲤鱼与绿鲤鱼 1条
李.? 李杰和李莲英和李二棍子 3条
李.* 李杰和李莲英和李二棍子 1条
李.+ 李杰和李莲英和李二棍子 1条
李. 李杰和李莲英和李二棍子 1条
李[杰莲英二棍子]* 李杰和李莲英和李二棍子 3条
李[^和]* 李杰和李莲英和李二棍子 3条

 

    # 校验用户身份证号码
     身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
     ^[1-9][0-9]{14}
     ^[1-9][0-9]{16}[0-9x]
      
    # 校验邮箱、快递单号、座机号...
    	"""很多常见的正则校验符号 不需要我们编写 直接百度查找即可"""

    ps:百度的前提是自己能够看懂别人写的大致意思
      	^[1-9]\d{13,16}[0-9x]$
        ^[1-9]\d{14}(\d{2}[0-9x])?$
        ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

贪婪匹配与非贪婪匹配


    # 正则表达式            # 待匹配文本                  # 结果
      <.*>          <script>alert(123)<script>         1条  贪婪匹配
                   以最后一个大括号的出现作为结束标志

      <.*?>        <script>alert(123)<script>	        2条  非贪婪匹配
                   以第一个大括号的出现作为结束标志

    '''
    量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可
    贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
    '''

取消转义


      # 在正则中两个\\可取消一个\的转义

        \n	\n	 False
        \\n	\n	 True
        \\\\n	\\n	 True	
      '''在python中还可以在字符串的前面加r取消转义 更加方便'''

re模块


    # 在python中无法直接使用正则 需要借助于模块
      1.内置的re模块
      2.第三方的其他模块

    import re

    res = re.findall('a', 'jason oscar aaa')  # findall(正则表达式,待匹配的文本)
    print(res)  # ['a', 'a', 'a', 'a', 'a']  # 结果是所有符合条件的数据 并且组织成了列表

    res1 = re.search('a', 'jason oscar aaa')  # search(正则表达式,待匹配的文本)
    print(res1)  # 查找到一个符合条件的数据就结束  没有则返回None
    print(res1.group())  # a  没有则无法调用group() 直接报错

    res2 = re.match('j', 'jason oscar aaa')  # match(正则表达式,待匹配的文本)
    print(res2)  # None  从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
    print(res2.group())  # j  没有则无法调用group() 直接报错

    res3 = re.finditer('a', 'jason oscar aaa')  # finditer(正则表达式,待匹配的文本)
    print(res3)  # 结果是一个迭代器对象 为了节省空间
    print([obj.group() for obj in res3])  # ['a', 'a', 'a', 'a', 'a']

    obj = re.compile('\d+')  # 提前写好后续需要经常使用的正则
    print(re.findall(obj,'asjd21hj13123j'))  # 写一遍之后 直接反复调用即可
    print(re.findall(obj,'234328748hgjghj'))  # 写一遍之后 直接反复调用即可
    print(re.findall(obj,'jhjhjh423432423'))  # 写一遍之后 直接反复调用即可

 

posted @ 2022-03-28 18:02  Mr_胡萝卜须  阅读(22)  评论(0编辑  收藏  举报