美文网首页
01.16 re模块

01.16 re模块

作者: xxxQinli | 来源:发表于2019-01-16 19:49 被阅读0次

    1. compile(正则表达式)

    将正则表达式转换成正则对象

    • 编译后可以直接通过对象调用相关的对象方法
    
     re\_object = re.compile(r'\\d{3}')
    
     re\_object.fullmatch('432')
    

    2. fullmatch(正则表达式, 字符串)

    让字符串和正则表达式完全匹配,匹配成功返回匹配对象,匹配失败返回None

    • 应用:检测字符串内容是否符合要求,例如:检测账号、密码、判断手机号、身份证号等是否合法
     result = re.fullmatch(r'(\\d{3})=([a-z]+)', '342=sjaks')
    
     print(result)
    
    • 匹配对象

    • 1).span() - 匹配到的字符串在原字符串中的下标范围(结果是元素)

     print('====span====')
    
     print(result.span()) \# 获取整个正则表达式匹配到的内容的范围
    
     \# start, end = result.span()
    
     \# print(start, end)
    
     print(result.span(1)) \# 获取正则表达式中第一个分组匹配到的内容的范围
    
     print(result.span(2)) \# 获取正则表达式中第二个分组匹配到的内容的范围
    
    • 2). start()和end() - 匹配到的字符串在原字符串中的开始下标和结束下标

     print('====start名,end====')
    
     print(result.start(), result.end())
    
     print(result.start(1), result.start(2))
    
    • 3). group() - 获取匹配到的字符串(结果是字符串)

     print(result.group()) \# 获取整个正则匹配到的字符串
    
     print(result.group(1)) \# 获取第一个分组匹配到的字符串
    
     print(result.group(2)) \# 获取第二个分组匹配到的字符串
    
     print(result.groups()) \# 同时获取所有分组匹配到的字符串(结果是元祖)
    
    • 4). string - 获取原字符串

     print(result.string)
    

    3.match(正则表达式,字符串)

    让字符串的开头和正则表达式进行匹配,匹配成功结果是匹配对象,否则是None

     print(re.match(r'\\D\\d', 's3skjkjks'))
    

    4.search(正则表达式,字符串)

    在字符串中去匹配出第一个符合正则表达式的子串, 匹配成功结果是匹配对象,否则是None

     print(re.search(r'[\\u4e00-\\u9fa5]{3}', 'hsj后视ss023你好吗,skss上的30s'))
    

    5.split(正则表达式,字符串)

    将字符串按照满足正则要求的子串进行切割(返回值是列表)

     print(re.split(r'\\d+', 'asj38jkas0093kjsj78kajs89==asdfj3jkkss'))
    

    6.sub(正则表达式,字符串1, 字符串2)

    将字符串2中能够和正则表达式匹配的子串替换成字符串1,产生一个新的字符串

    print(re.sub(r'\d+', '*', 'jsj93jksj93j5a45s3s是看得见'))

    print(re.sub(r'傻逼|[傻艹草操]', '*', '你是傻逼吗?艹!'))

    7.findall(正则表达式, 字符串)

    在字符串中获取满足正则表达式的所有的子串(结果是列表)

     # 注意: 如果正则表达式中有分组,直接获取到的是分组中匹配到的内容; 如果有多个分组列表中的元素是元祖
    
     print(re.findall(r'\\d+[a-z]', 'sjh83bkss93ksjhf9922'))
    
     print(re.findall(r'(\\d+)[a-z]', 'sjh83bkss93=sjhf9922'))
    
     print(re.findall(r'abc(\\d{2}|[A-Z]{2})', '=-aaabc73kkjabcKJL=3'))
    

    8.finditer(正则表达式, 字符串)

    在字符串中获取满足正则表达式的所有的子串(结果是迭代器,元素是匹配对象)

     result = re.finditer(r'(\\d+)[a-z]', 'sj8khk83jks数据310sj=sd')
    
     print(result)
    
     print(next(result).group())
    

    9.re.I

    忽略大小写

     # 匹配的约束条件是放在函数的flags参数中的
    
     print(re.fullmatch(r'[a-z]{2}', 'SA', re.I))
    
     # 练习
    
     """
    
     验证输入用户名和QQ号是否有效并给出对应的提示信息
    
     要求:
    
     用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
    
     QQ号是5~12的数字且首位不能为0
    
     """
    
     re\_str1 = r'[a-zA-Z\\d\_]{6,20}'
    
     re\_str2 = r'[1-9]\\d{4,11}'
     
    
    import re
    
    # 贪婪
    print(re.search(r'\d+', 'abchs3482==sdd')) # 贪婪 return <re.Match object; span=(5, 9), match='3482'>
    print(re.search(r'\d+?', 'abchs3482==sdd')) # 非贪婪 return <re.Match object; span=(5, 6), match='3'>
    print(re.search(r'"name":".*?",', '====,"name":"yuting","age":18, "爱好":"编程",....')) # 非贪婪 retuen <re.Match object; span=(5, 21), match='"name":"yuting",'>
    
    re.compile #创建一个partten对象,对象可以直接用正则方法
    re_object = re.compile(r'\d\d_')
    print(re_object.fullmatch('22_'))
    
    """
    print(result.group())   # 获取整个正则匹配到的字符串,整个
    print(result.group(1))  # 获取第一个分组匹配到的字符串,分组
    print(result.group(2))  # 获取第二个分组匹配到的字符串,分组
    print(result.groups())  # 同时获取所有分组匹配到的字符串(结果是元祖),分组元组
    """
    
    re.fullmatch # partten与字符串必须完全匹配,不能字符串中包含partten return <re.Match object; span=(0, 1), match='3'> 有group() span() start() end() string
    print(re.fullmatch(r'\d*?', '234')) 
    
    re.match # 从开头开始匹配,return <re.Match object; span=(0, 1), match='2'> 有group() span() start() end() string
    print(re.match(r'\d{1,3}', '2sf').span())
    
    re.sub # 将匹配的到的替换, return替换后的字符串
    print(re.sub(r'\d\s_', '*', 'asdas3 _asd5 _asd'))
    
    re.findall # 将所有匹配到的提出来成为一个列表, return匹配成功的列表
    # 若匹配到了的里面有分组,分组会形成一个元组,而没在分组里的则不会显示出来
    result = re.findall(r'\'\w+\':\s*\'*\w+\'*', "{'name': 'qinli' ,'age': 234}")
    print(result)
    
    re.finditer # 产生迭代器,next()后返回 <re.Match object; span=(1, 16), match="'name': 'qinli'"> 有group() span() start() end() string
    # group()是每组的内容冒号隔开,groups()是所有内容的元组
    result = re.finditer(r'(\'\w+\'):(\s*\'*\w+\'*)', "{'name': 'qinli' ,'age': 234}")
    print(next(result).string)
    print(next(result).group())
    
    re.split # 将匹配到的当作分隔处隔开,return分隔后的列表
    # 若开头和结尾匹配到,会在开头和结尾产生一个
    print(re.split(r'[^a-z0-9A-Z]+', "{'name': 'qinli' ,'age': 234}"))
    
    re.search # 只找得第一个匹配的,return <re.Match object; span=(2, 7), match="name'"> 有group() span() start() end() string
    result = re.search(r'([a-z]+)\'', "{'name': 'qinli ,'age': 234}")
    print(result.group(), result.groups(), result.group(1))
    
    re.I # 不区分大小写
    print(re.fullmatch(r'[a-z]{2}', 'SA', re.I))
    

    相关文章

      网友评论

          本文标题:01.16 re模块

          本文链接:https://www.haomeiwen.com/subject/wklvdqtx.html