美文网首页
【19】正则表达式

【19】正则表达式

作者: Z_JoonGi | 来源:发表于2019-03-27 17:30 被阅读0次

    1. 什么是正则表达式

    正则表达式是字符串匹配工具,它是为了在某些需求下更方便、更快速的处理字符串。

    2. 怎么使用正则处理字符串

    python通过提供re模块来支持正则表达式

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

    让正则表达式和字符串进行完全匹配,返回匹配结果,如果匹配不成功赶回None

    3.怎么写正则表达式

    python中正则表达式是放字符串中,并且这个字符串一般会在最前面加r/R。

    r'正则'
    

    4.正则语法

    • 1)普通字符: 代表字符本身
    re_str = r'a'
    result = re.fullmatch(re_str, 'abc')
    
    • 2) . 匹配一个任意字符

    一个 . 代表一个字符,匹配的是任意字符

    re_str = r'.abc'
    
    • 3)\w:匹配ASCII表中)中一个字母、数字或者下划线,还可以匹配所有的费ASCCII表字符
    re_str = r'.\w'
    result = re.fullmatch(re_str, '22')
    
    • 4) \s 匹配一个空白字符
    re_str = r'金额:\s\s商品'
    result = re.fullmatch(re_str, '金额:  商品')
    

    空白字符包括:空格、回车、制表符

    • 5) \d 匹配一个数字字符
    re_str = r'年龄:\d\d'
    result = re.fullmatch(re_str, '年龄:18')
    
    • 6) \b 检测单词边界(检测反斜杠位置是否为单词边界)

    单词边界:所有能够标志一个单词结束的符号都是单词边界,例如:空格、换行、标点符号、字符串开头与结束

    re_str = r'\bhow\b are\b'
    result = re.fullmatch(re_str, 'how are')
    
    • 7) ^: 检查是否是字符串开头
    re_str = r'^\d\d'
    result = re.search(re_str, '11fsdfsd')
    
    • 8) $: 检查是否字符串结尾
    result = re.findall(r'\d\d$', '11fsdfsd12')
    
    • 9) \大写字母:对‘\小写字母’功能的否定
      • \W 匹配非数字、字母、下划线
      • \S 匹配非空白字符
      • \ D 匹配非数字字符
      • \ B 检查是否是非单词边界
    re_str = r'\W\S\B\D'
    result = re.fullmatch(re_str, '~av')
    
    • 10)
      • a.[字符集]: 匹配[ ]中任意的一个字符
    re_str = r'[abskdn]kkkk'
    result = re.fullmatch(re_str, 'akkkk')
    
      • b.[字符1-字符2]: 匹配编码值在字符1编码到字符2编码之间的任意一个字符(ord(字符1)<ord(字符2))
    [a-zA-Z] #所有字母
    [一-龥] #所有的中文
    [a-zA-z_\d]#字母数字下划线
    re_str = r'[0-9]kkkk'
    result = re.fullmatch(re_str, '3kkkk')
    
      • c.[ ]:中的内容最前面加^,表示否定
    [^a-z]#表示除了小写字母的其他所有字符
    re_str = r'[^a-z]kkkk'
    result = re.fullmatch(re_str, '3kkkk')
    

    若^ 放再中间,如[az^ A-Z],则输出的内容包含^

    • 11)转义符号:将正则中有特殊意义或者有特殊功能的符号,表示符号本身
      方法

      • a.在中括号外面
        在特殊意义的符号前加''让其特殊意义消失
    re_str = r'\d\d\.\d\d\$'
    result = re.fullmatch(re_str, '12.51$')
    
      • b.在中括号里面
        单独的有特殊意义的符号,除了‘^’在最前面和‘-’在两个字符之间,其他的都不需要转义,特殊意义会自动消失
    re_str = r'\d\d[.]\d\d\[$]'
    result = re.fullmatch(re_str, '12.51$')
    
    • 12) * : 匹配0次或多次
    r'a*bc'  - 匹配一次字符串,‘bc’前有0个或者多个a
    
    re_str = r'\d\d*\.\d\d*'
    result = re.fullmatch(re_str, '012.35')
    
    • 12) +: 匹配1次或多次
    r'[abc]+'   #匹配一个字符串有一个或多个字符,每个字符是abc中的一个
    r'a+|b+|c+|'  #匹配一个字符串有一个或多个字符,字符全是a或b或c
    
    re_str = r'\d+\.\d+'
    result = re.fullmatch(re_str, '0.35')
    
    • 13) {}:
      • {N} 匹配N次
    re_str = r'\d{10}\.\d+'
    result = re.fullmatch(re_str, '1000000000.35')
    
      • {M,N} 匹配M到N次
    re_str = r'\d{3,5}\.\d+'
    result1 = re.fullmatch(re_str, '10000.35')
    result2 = re.fullmatch(re_str, '10000.35')
    
      • {M,}匹配至少M次
    re_str = r'\d{3,}\.\d+'
    result1 = re.fullmatch(re_str, '111.35')
    
      • {,N}匹配至多N次
    re_str = r'\d{,3}\.\d+'
    result1 = re.fullmatch(re_str, '.35')
    
    • 13) ?: 匹配0次或者1次
    a. 以上是贪婪匹配:匹配次数不确定的时候,尽可能多的匹配
    b. 非贪婪匹配:在匹配次数不确定符号后加“?”,尽可能少的匹配
    • 14) | :(分支)
    正则1|正则2    #先用正则1去匹配,如果匹配成功就成功,匹配不成功用正则2去匹配
    
    注意:请注意短路效果
    • 15) ():(分组)
      a.将小括号里面的内容作为一个整体操作
    re_str = r'[a-zA-Z\d]{5,11}(aa|bb|cc)'
    result1 = re.fullmatch(re_str, 'hshdhaa')
    

    b. \数字(重复第几个分组匹配结果)

    re_str = r'(4512)-\1'
    result1 = re.fullmatch(re_str, '4512-4512')
    
    re_str = r'(4512)-\1{4}'
    result1 = re.fullmatch(re_str, '4512-4512451245124512')
    

    5. re模块中的方法

    匹配对象

    span匹配到的内容在原字符串中的位置

    result.span()   #整个正则表打式匹配结果的范围
    result.span(n) #正则表达式中第n个分组的范围
    result.start(2)
    result.end(2)
    

    获取匹配到的值

    result.group() #整个正则表达式的匹配结果
    result.group(2) #获取第二个分组的匹配结果
    

    获取原字符串

    result.string()
    
    a. re.fullmatch(正则对象,字符串)
    • 完全匹配--让字符串长度和字符串每个字符的值和正则表达式完全匹配
    • 匹配成功返回匹配对象,匹配失败返回None
    • 需要对整个字符串进行条件判断的时候使用,例如,检查账号是否合法,密码是否符合要求等
    b. re.match(正则表达式, 字符串)
    • 判断字符串的开头是否和正则表达式相匹配。匹配成功返回匹配对象,匹配失败返回None
    c. re.serch(正则表达式, 字符串)
    • 在字符串中查找是否有和正则表达式匹配的子串,如果没有返回None,如果有就返回第一个匹配结果
    d. re.findall(正则表达式,字符串)
    • 获取字符串中所有满足正则表达式的子串
    注意:
    • 正则表达式中没有分组时,整个正则表达式匹配的结果作为列表元素(列表元素是字符串)
    • 有一个分组时,则返回这个分组匹配到的结果作为列表元素(列表元素为字符串)
    • 当有多个分组时,将元祖作为列表元素,每个分组匹配到的结果作为元祖的元素(列表元素是元祖)
    e. re.finditer(正则表达式,字符串)
    • 获取子串中所有能够和正则表达式匹配的子串匹配的结果
    • 返回值是一个迭代器,迭代器的元素是匹配对象
    f. re.split(正则表达式,字符串)
    • 将字符串按照满足正则表达式的子串进行切割
    e. re.sub(正则表达式,新字符串,字符串,替换次数)
    • 将字符串中满足正则表达式的子串替换成新的
    • 替换次数可以不赋值,默认为全替换

    相关文章

      网友评论

          本文标题:【19】正则表达式

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