day17-学习总结

day17-学习总结

一、正则表达式

  1. 什么是正则表达式?

    ​ 正则表达式是一种可以让复杂的问题变得简单的工具。

    ​ 正则表达式并不是python特有语法(不属于python),所有的高级语言都支持正则表达式,正则的语法通用。

    ​ 不管通过正则表达式解决的什么问题,写正则表达式都是在使用正则表达式描述字符串规则。

  2. python的re模块

    ​ re模块是python用来支持正则表达式的一个模块,模块中包含了所有和正则相关的函数。

    ​ fullmatch(正则表达式,字符串):判断正则表达式和指定的字符串是否完全匹配(判断整个字符串是否符合正则表达式所描述的规则);如果匹配成功返回匹配对象,匹配失败返回None。

  3. 正则语法 —— 匹配类符号

    1)普通符号 —— 在正则表达式中表示符号本身的符号;

    2). —— 匹配任意一个字符;

    3)\d —— 匹配任意一个数字字符;

    4)\s —— 匹配任意一个空白字符;

    ​ 空白字符 —— 能产生空白效果的字符,例如:空格、换行、水平制表符

    5)\D —— 匹配任意一非数字字符

    6)\S —— 匹配任意一个非空白字符

    7)[字符集] —— 匹配字符集中任意一个字符

    ​ [1-9] —— 匹配1~9中的任意一个数字;

    ​ [a-z] —— 匹配任意一个小写字母;

    ​ [A-Z] —— 匹配任意一个大写字母;

    ​ [a-zA-Z] —— 匹配任意一个字母;

    ​ [a-zA-Z\d_] —— 匹配字母、数字或者下划线;

    ​ [\u4e00-\u9fa5] —— 匹配任意一个中文字符

    注意:[]中减号放在两个字符之间表示谁到谁(确定的方式是根据字符编码值大小确定的 );如果减号不在两个字符之间,表示一个普通字符。

    8)[ ^ 字符集] —— 匹配不在字符集中的任意一个字符。

    补充:

    \w :匹配字母数字及下划线;

    \W:匹配非字母数字下划线。

  4. 匹配次数

    1)* —— 0次或多次(任意次数)

    注意:*在谁的后面控制的就是谁的次数。

    用法:匹配符号*

    ​ a* —— 0个或多个a;

    ​ \d* —— 0个或多个任意数字(任意多个任意数字)

    result = fullmatch(r'a*123','123')
    print(result) # <re.Match object; span=(0, 3), match='123'>
    

    2)+ —— 1次或者多次(至少一次)

    result = fullmatch(r'\d+abc','6abc')
    print(result)    # <re.Match object; span=(0, 4), match='6abc'>
    

    3)? —— 0次或1次

    result = fullmatch(r'A?123','123')
    print(result)     # <re.Match object; span=(0, 3), match='123'>
    

    4){}

    ​ {m,n} —— m到n次;

    ​ {m,} —— 至少m次;

    ​ {,n} —— 最多n次;

    ​ {n} —— n次

    result = fullmatch(r'[a-z]{3,5}123','babm123')
    print(result)   
    # <re.Match object; span=(0, 7), match='bamb123'>
    

    练习:写一个正则,判断输入的内容是否是一个合法的QQ号(长度是5~12位的数字,第一位不能是0)。

    qq_num=input('请输入你的QQ号:')
    result=fullmatch(r'[1-9]{4,11}',qq_num)
    if result:
        print(f'{qq_num}合法')
    else:
         print(f'{qq_num}不合法')
    

二、贪婪匹配和非贪婪匹配

  1. 贪婪和非贪婪

    ​ 当匹配次数不确定的时候(*、+、?、{m,n}、{,n}),匹配模式分为贪婪匹配和非贪婪匹配,默认是贪婪的。

    ​ 贪婪匹配和非贪婪匹配:在匹配成功的时候有多种匹配结果,贪婪取最多次数对应的结果,非贪婪去最少次数对应的结果。(匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最多次数,非贪婪取最少次数)

    贪婪模式:*、+、?、{m,n}、{,n}

    非贪婪模式:*?、+?、??、{m,n}?、{,n}?

    # 1)贪婪模式
    result = match(r'a.+b','amb计算bxxbm')
    print(result)    
    # <re.Match object; span=(0, 9), match='amb计算bxxb'>
    
    # 2)非贪婪模式
    result = match(r'a.+?b','amb计算bxxbm')1
    print(result)
    # <re.Match object; span=(0, 3), match='amb'>
    

    注意:如果匹配结果只有一种可能,那么贪婪和非贪婪的结果一样。

三、分组和分支

  1. 分组 —— ()

    1)整体 —— 将正则表达式中的一部分作为一个整体进行相关操作;

    2)重复 —— 可以在正则表达式中通过\M来重复它前面的第M个分组的结果;

    3)捕获 —— 只能获取正则表达式中的一部分匹配到的结果(分为手动和自动捕获两种)

    result = fullmatch(r'(\d{2})([a-z]{3})=\2\1','23mkj=mkj23')
    print(result)
    

    注意:只能重复在它出现之前的分组内容,无法重复在它之后出现的内容。

    练习:提取message中成绩对应的字符串

    message='name:小明,math:60分,english:89分,chinese:88分,sports:97分'
    result = findall(r'(\d+)分',message)
    print(result)
    
  2. 分支

    ​ 正则1|正则2|正则3|… —— 匹配可以和多个正则中任意一个正则匹配的字符串。

    ​ 注意:如果想要正则表达式中的一部分实现多选一的效果,变化的部分用分组表示。

    result = fullmatch(r'a(\d{3}|[a-z]{3})b','amklb')
    print(result)
    

四、转移符号和检测类符号

  1. 转义符号

    ​ 正则中的转义符号,就是在本身具备特殊功能或者特殊意义的符号前加’\',让这个符号变成一个普通符号。

    result = fullmatch(r'\d+\.\d+','23.879')
    print(result)
    # <re.Match object; span=(0, 6), match='23.879'>
    
  2. []里面的转义字符

    ​ 单独存在有特殊意义的符号(+、*、?、.等),在[]中特殊意义会自动消失。

    result = fullmatch(r'\d+[.**?]\d+','23?879')
    print(result)
    

    注意:本身在[]中有特殊功能的符号,如果要表示普通符号必须加’\'。

    result = fullmatch(r'a[M\-N]b','a-b')
    print(result)
    # <re.Match object; span=(0, 3), match='a-b'>
    
  3. 检测类符号

    ​ 检测类是在匹配成功的情况下,检测检测类符号所在的位置是否符合相关要求。

    1)\b —— 检测是否是单词边界

    ​ 单词边界:可以将两个单词区分开的符号都是单词边界,比如:空白字符、英文标点符号、字符串开头和字符串结尾。

    message='283mn45,89 司机34kn;23;99mll==910,230 90='
    result =findall(r'\b\d+\b',message)
    print(result )    # ['89', '23', '910', '230', '90']
    

    2)\B —— 检测是否不是单词边界

    message='283mn45,89 司机34kn;23;99mll==910,230 90='
    result =findall(r'\B\d+\B',message)
    print(result )  # ['83', '4', '34', '9', '1', '3']
    

    3)^ —— 检测是否是字符串开头

    message='283mn45,89 司机34kn;23;99mll==910,230 90='
    result =findall(r'^\d+',message)
    print(result )      # ['283']
    

    4)$ —— 检测是否是字符串结尾

    message='283mn45,89 司机34kn;23;99mll==910,230 90='
    result =findall(r'.{5}$',message)
    print(result )    # ['0 90=']
    

五、re模块常用函数

  1. 常用函数

    1)fullmatch(正则表达式,字符串):判断整个字符是否符合正则表达式描述的规则,匹配成功返回匹配对象。

    2)match(正则表达式,字符串):判断字符串开头是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空。

    result = match(r'\d{3}','2654as232xsb54644')
    print(result)      
    # <re.Match object; span=(0, 3), match='265'>
    

    3)search(正则表达式,字符串):获取字符串中第一个能和正则匹配成功的子串,能找到返回匹配对象,找不到返回空。

    result = search(r'\d{3}','ba232xsb54644')
    print(result)   
    # <re.Match object; span=(2, 5), match='232'>
    

    4)findall(正则表达式,字符串): 获取字符串中所有满足正则的子串,返回一个列表,列表中的元素是字符串。

    注意:如果正则表达式中有分组,会针对分组做自动捕获(只获取分组匹配到的结果)。

    result = findall(r'\d{3}', 'ba203还是678说kk0222jksn就是23311')
    print(result)   # ['203', '678', '022', '233']
    

    5)finditer(正则表达式,字符串):获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是每个子串对应的匹配对象。

    result = finditer(r'\d{3}', 'ba203还是678说kk0222jksn就是23311')
    print(list(result))   
    # [<re.Match object; span=(2, 5), match='203'>, <re.Match object; span=(7, 10), match='678'>, <re.Match object; span=(13, 16), match='022'>, <re.Match object; span=(23, 26), match='233'>]
    

    6)split(正则表达式,字符串):将字符串中所有满足正则的子串作为切割点对字符串进行切割。

    str1 = '123aMKnb嗑生嗑死aKKssa923b==='
    # 将str1中的a和b作为切割点对字符串进行切割
    result = split(r'a|b', str1)
    print(result)      
    # ['123', 'MKn', '嗑生嗑死', 'KKss', '923', '===']7)sub(正则表达式, 字符串1, 字符串2)  - 将字符串2中所有满足正则的子串都替换成字符串1
    

    7)sub(正则表达式, 字符串1, 字符串2) :将字符串2中所有满足正则的子串都替换成字符串1。

    message = '我草!你TM看不见吗?f u c k!'
    result = sub(r'(?i)草|TM|f\s*u\s*c\s*k|sb|妈', '*', message)
    print(result)
    # 我*!你*看不见吗?*!
    
  2. 匹配对象

    result = search(r'(\d{3})([A-Z]{2})', '-=2设计师234KM222哈哈宿舍239KH')
    print(result)      
    # <re.Match object; span=(6, 11), match='234KM'>
    

    1)直接获取整个正则表达式对应的匹配结果: 匹配对象.group()。

    2)手动捕获某个分组对应的匹配结果: 匹配对象.group(分组数)。

    3)获取匹配结果在原字符串中的位置: 匹配对象.span()。

    print(result.span())            # (6, 11)
    print(result.span(2))           # (9, 11)
    
  3. 参数

    1)匹配忽略大小写:(?i)

    result = fullmatch(r'(?i)abc', 'AbC')
    print(result)
    

    2)单行匹配: (?s)

    ​ 多行匹配(默认):匹配的时候.不能和换行(\n)进行匹配;
    ​ 单行匹配:匹配的时候.可以和换行(\n)进行匹配。

    result = fullmatch(r'(?s)abc.123', 'abc\n123')
    print(result)     
    # <re.Match object; span=(0, 7), match='abc\n123'>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值