美文网首页
day17-正则表达式

day17-正则表达式

作者: 冯书简 | 来源:发表于2019-06-25 17:15 被阅读0次

    正则符号

    1.什么是正则

    正则是字符串匹配的一种工具,拥有自己的语法。语法中主要包含各种符号的使用

    2.正则语法

    re.fullmatch(正则表达式,字符串) - 检查字符串是否完全符合正则表达式的规则(完全匹配)
    匹配成功返回匹配对象,失败返回None
    正则表达式 - python中正则表达式是写在引号(单引号或双引号)中的内容,
    一般会在引号的前面加r
    r'正则表达式'

    js中的正则:/正则表达式/

    print('==============匹配符号=================')
    # 1)普通字符  -   除了正则中有特殊功能和特殊意义以外的其他所有字符
    # 普通字符在正则中表示字符本身
    # 例如:a,b,c,1,2,3,~,你,
    
    # 表示一个字符串有三个字符,每个字符分别是a,b,c
    re_str = r'abc'
    result = re.fullmatch(re_str, 'abc')
    print(result)
    

    2) . - 匹配任意字符

    正则中出现 . 的位置可以匹配任意字符
    一个 . 只能匹配任意字符

    # 匹配一个长度是3的字符串,字符开头是a,结尾是b,中间任意字符
    re_str = r'a.b'
    result = re.fullmatch(re_str, 'a9b')
    print(result)
    

    3)\w - 匹配字符、数字或者下划线(只针对ascii码有效)

    一个\w只能匹配一个字符
    注意:Unicode码中除了ASCII表以外的其他字符都能匹配

    result = re.fullmatch(r'a\wb.', 'a_b4')
    print(result)
    

    4)\s - 匹配一个空白字符

    空白:空白、回车/换行、制表符

    result = re.fullmatch(r'abc\s123', 'abc\n123')
    print(result)
    

    5) \d - 匹配一个数字字符

    result = re.fullmatch(r'a\d\db', 'a89b')
    print(result)
    

    6) \大写字母 - 匹配非\小写字母匹配到的内容

    \W - 匹配非数字、字母、下划线
    \S - 匹配非空白字符
    \D - 匹配非数字字符

    result = re.fullmatch(r'\D\Dabc\S123', 'qwabc1123')
    print(result)
    

    7) [] - 匹配字符集

    a.普通用法
    [字符集] - 匹配字符集中的任意字符
    [az1+] - 匹配一个字符是a或者z或者1或者+
    [\dabc] - 匹配一个字符是数字或者a或者b或者c

    b.表示范围的字符集 [字符1-字符2] - 从字符1到字符2中任意一个字符,字符2的编码值必须大于字符1
    [5-9] - 匹配数字字符5到9中任意一个
    [a-z] - 匹配小写字母中的任意一个
    [a-zA-Z] - 匹配任意一个字母
    [a-zA-Z\d_] - 匹配字母数字下划线

    c.反向选中:[^字符集] - 选中除了字符集中以外的其他的任意一个字符
    [^abc] - 只要不是a或者b或者c都匹配

    print(re.fullmatch(r'[az1]abc', '1abc'))
    print(re.fullmatch(r'[\daz1]abc', '3abc'))
    print(re.fullmatch(r'[a-z]abc', 'vabc'))
    print(re.fullmatch(r'[5-8][5-8]', '67'))
    
    print('==============检测符号=================')
    # 一个匹配符号必须对应一个具体的字符;检测符号只是对符号所在的位置进行检查,不会影响字符串的长度
    # 1)\b    -   检测是否是单词边界
    """
    单词边界:一切可以将两个单词区分开的符号都是单词边界,例如单词开头、单词结尾、空白标点符号等
    """
    # 匹配一个字符串是'howare',然后检测w的后面是否是单词边界
    print(re.fullmatch(r'how\b are', 'how are'))
    # 2) ^  -   检测^所在的位置是否是字符串开头
    print(re.fullmatch(r'^abc', 'abc'))
    print(re.search(r'abc', '123abc567'))
    # 3) $    -   检测$所在的位置是否是字符串结尾
    

    1.匹配次数

    1)* - 匹配0次或多次

    字符 * 前的字符出现0次或者多次
    r'a
    ' - '', 'a', 'aa', 'aaa'

    print(re.fullmatch(r'a\d*b', 'a3534656b'))
    

    2) + 匹配一次或多次

    print(re.fullmatch(r'a\d+b', 'a8823b'))
    

    3)? 匹配0次或一次

    print(re.fullmatch(r'[+-]?\d+', '+293'))
    

    4){}

    {N} - 匹配N次
    {M,N} - 匹配M到N次
    {M,} - 匹配至少M次
    {,N} - 匹配最多N次

    print(re.fullmatch(r'a{3}123', 'aaa123'))
    print(re.fullmatch(r'a{2,5}123', 'aaa123'))
    print(re.fullmatch(r'a{2,}123', 'aa123'))
    print(re.fullmatch(r'a{,2}123', 'aa123'))
    
    # qq = input('请输入球球号')
    # print(re.fullmatch(r'[1-9]\d{4,11}', qq))
    # user_name = input('账号')
    # print(re.fullmatch(r'[\da-zA-Z_]{6,20}', user_name)
    

    2.贪婪和非贪婪

    , +, ?, {}对应匹配次数是贪婪;在匹配次数不确定的时候才有贪婪和非贪婪区分
    在匹配次数不确定的符号后面叫?,就会变成贪婪:
    ?, +?,??,{M,N}?,{M,}?, {,N}?

    贪婪:在匹配成功的前提下尽可能多的匹配
    非贪婪:在匹配成功的前提下,尽可能少的匹配

    result = re.search(r'.+b', '123bcccbdddb====')
    print(result)
    print(re.search(r'.+?b', '123bcccbdddb===='))
    

    3.分之

    正则表达式1|正则表达式2

    print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'asd'))
    

    4. () - 分组

    1.分组 - 将正则中的一部分看成一个整体进行操作
    2.重复 - 添加分组后,可以在分组的后面通过'\M'来处重复前面第M个分组匹配到的结果

    print(re.fullmatch(r'(\d{3}|[a-zA-Z]{3})[A-Z]+', '123WEEWFSD'))
    print(re.fullmatch(r'(\d{2}:)+\d\d', '23:43:36:78'))
    print(re.fullmatch(r'(\d+)abc\1', '100abc100'))
    

    5.转义符号 - 在正则符号前加\,让这个符号的功能消失

    正则中的转义符号和字符串的转义字符不一样
    独立额特殊符号放在[]中特殊意义会自动消失,但-,[] ... 除外

    re_str = r'\.abc'
    print(re.fullmatch(re_str, '.abc'))
    
    print(re.fullmatch(r'\d\+\\d', '2+\d'))
    print(re.fullmatch(r'[.+*]abc[?]', '.abc?'))    # .  *  +  ?
    print(re.fullmatch(r'[a\-z]abc', '-abc'))
    
    print(re.fullmatch(r'[a\]]abc', ']abc'))
    

    1.创建正则对象

    compile(正则表达式) - 根据正则表达式创建正则对象

    re_obj = compile(r'\d{3}')
    print(re_obj.fullmatch('234'))
    

    2.匹配

    fullmatch(正则表达式,字符串) - 让整个字符串和正则表达式进行匹配
    match(正则表达式, 字符串) - 匹配字符串开头
    返回值:匹配成功是匹配结果对象,匹配失败是None

    result = fullmatch(r'\d{3}[a-z]{4}', '123jsdv')
    print(result)
    
    result = match(r'(\d{3})[a-z]{4}', '124sdfsaqqw你好')
    print(result)
    

    匹配结果
    1)匹配结果对应的字符串

    匹配对象.group() - 获取整个正则匹配到的结果
    匹配对象.group(N) - 获取第N个分组匹配到的结果

    print(result.group())
    print(result.group(1))
    

    2)获取匹配位置

    匹配对象.span(group=0)
    匹配对象.start(group=0)
    匹配对象.end(group=0)

    print(result.span(1))
    print(result.start())
    print(result.end())
    

    3)获取原字符串

    print(result.string)
    

    3.查找

    search(正则表达式, 字符串) - 匹配出字符串中第一个满足正则表达式的字串,结果是匹配对象
    findall(正则表达式, 字符串) - 获取字符串中满足正则表达式的所有字串;结果是列表,列表中是字符串
    finditer(正则表达式, 字符串) - 获取字符串中满足正则表达式的所有的字串;结果是迭代器,迭代器的元素是匹配对象

    result = search(r'\d{3}', 'how2144b345in432ln567')
    print(result)
    
    result = findall(r'\d{3}', 'how2144b345in432ln567')
    print(result)
    
    result = findall(r'(\d{3})a', 'how2144ab345in432aln567')
    print(result)
    
    result = finditer(r'(\d{3})a', 'how2144ab345in432aln567')
    print(next(result))
    print(next(result))
    

    4.切割

    split(正则表达式, 字符串) - 按照满足正则表达式的字串对字符串进行切割,返回列表

    str1 = 'aaa9bb99ddsf239945529dg14956'
    print(str1.split('9'))
    
    print(split(r'\d+', str1))
    

    5.替换

    sub(正则表达式, 字符串1, 字符串2, 替换次数=0) - 将字符串2中满足正则表达式的字串替换成字符串1
    替换次数为0则全部替换

    str1 = 'aaa9bb99ddsf239945529dg14956'
    new_str = sub(r'\d+', '+', str1, 2)
    print(new_str)
    

    相关文章

      网友评论

          本文标题:day17-正则表达式

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