美文网首页
正则表达式学习笔记

正则表达式学习笔记

作者: 道心蒙尘 | 来源:发表于2020-11-09 16:42 被阅读0次

    简介

    笔者的正则的学习笔记和思维导图

    用处

    1. 字符串匹配
    2. 字符串查找
    3. IDE集成

    如何学习

    1. 分类别记忆
    2. 多练习,无他,唯手熟尔。
    3. 潜龙勿用
    正则表达式.png

    1. 正则元字符

    何为元字符,就是有特殊意义的字符比如\d, \w,可以分为

    1. 特殊单字符
      a. \d 任意数字, \D 任意非数字
      b. \w 任意字母数字下划线, \W 任意非字母数字下划线
      c. \s 任意空白符, **\S ** 任意非空白符
      d. . 任意字符(换行符除外)

    2. 空白字符
      a. \r 回车
      b. \n 换行
      c. \f 换页符
      d. \t 制表符
      e. \v 垂直制表符

    3. 量词
      a. * 0到多次
      b. + 1到多次
      c. ? 0到1次
      d. {m} 出现m次
      e. {m,} 出现至少m次
      f. {m, n} M到N次

    4. 范围处理
      a. | 如ab|ac 代表ab或者ac.
      b. [……]多选一,任意单个元素,注意[1,2]代表1 , 2三个元素但是[^1]代表非1
      c. [a-z] 匹配a到Z之间的任意单个字符。常用的[a-zA-Z0-9]

    2. 正则匹配模式

    1. 贪婪匹配
    import re
    re.findall(r'a*', 'aaabbb')
    ['aaa', '', '', '', '']
    

    默认是贪婪模式,尽可能多的去匹配字符串

    1. 非贪婪匹配
    import re
    re.findall(r'a*?', 'aaabbb')
    ['', 'a', '', 'a', '', 'a', '', '', '', '']
    

    ? 代表非贪婪匹配,尽可能少的匹配字符串

    1. 独占模式
      无论是贪婪模式还是非贪婪模式,都需要回溯才能完成相应功能。还有一种不需要回溯,叫独占模式,准确的形容为,不会交还已经匹配上的字符。
      独占模式具体的方法就是在量词后加上加号(+)。
      什么是回溯呢
      Exp:
    pip install regex
    ipython
    import regex
    regex.findall(r'a{1,3}abb', 'aaabb')
    ['aaabb']
    
    regex.findall(r'a{1,3}+abb', 'aaabb')
    Out[8]: []
    
    regex.findall(r'a{1,3}?abb', 'aaabb')
    Out[9]: ['aaabb']
    

    贪婪模式下,会尽可能的多的匹配总费用,匹配第四个b时,碰到了c字符,需要回溯到前一个上在做c字符匹配。如果发生回溯,则可以匹配,如果不回溯,在独占模式下,则不匹配。

    3. 分组与编号

    正则表达式中()代表一个组。
    Exp: 匹配重复字符串

    text='man man , what`s the fuck fuck!'
    rexp=r'(\w+)(\s+\1)+'
    re.findall(rexp, text)
    [('man', '  man'), ('fuck', ' fuck')]
    

    正则表达式中 \1 就是前边 (\w+) 的值。
    那么多个括号嵌套怎么算?
    从第一个( 算起,编号从1到n,如果不想被引用,怎么办?
    加入 ?:

    rexp=r'(\w+)(?:\s+\1)(\2)'
    

    这里(\2)不会生效。

    这个功能设计看起来花里胡哨,如何落地使用呢??最简单的就是字符串替换

    
    >>> import re
    >>> test_str = "2020-05-10 20:23:05"
    >>> regex = r"((\d{4})-(\d{2})-(\d{2})) ((\d{2}):(\d{2}):(\d{2}))"
    >>> subst = r"日期\1 时间\5   \2年\3月\4日 \6时\7分\8秒"
    >>> re.sub(regex, subst, test_str)
    '日期2020-05-10 时间20:23:05   2020年05月10日 20时23分05秒'
    

    4. 匹配模式

    1. 不区分大小写
    >>> import re
    >>> re.findall(r"cat", "CAT Cat cat", re.IGNORECASE)
    ['CAT', 'Cat', 'cat']
    

    a. 不区分大小写模式的指定方式,使用模式修饰符 (?i)
    b. 修饰符如果在括号内,作用范围是这个括号内的正则,而不是整个正则;
    c. 使用编程语言时可以使用预定义好的常量来指定匹配模式。

    1. . 通配模式
      匹配任意字符可以用 [\s\S], [\d\D], [\w\W] 但是比较麻烦
      可以设置点号通配符
    (?s).
    
    1. 多行模式
      (?m)
      正则中还有 \A 和 \z(Python 中是 \Z) 这两个元字符容易混淆,\A 仅匹配整个字符串的开始,\z 仅匹配整个字符串的结束,在多行匹配模式下,它们的匹配行为不会改变,如果只想匹配整个字符串,而不是匹配每一行,用这个更严谨一些

    2. 注释模式
      (?#comment)

    5. 断言

    1. 单词边界
    2. 行的开始/结束
    3. 环视

    6.转义字符

    这里什么好说的,需要注意编程语言自身会做转义字符处理,正则还要做转义字符处理,有时候会是4个\

    7. 历史

    1. POSIX
    2. PCRE

    8 拓展

    笔者认为:正则表达式是一种图灵不完备的编程范式,每种语言go、python、 java、js都有各自的实现与支持的规范。
    但是正则表达式包含了常见语言的三要素:

    1. 顺序
    2. 分支 a|b
    3. 循环 *, +, {m, n}

    甚至还有作用域()

    结束语

    持续学习和输出会让你更快乐

    相关文章

      网友评论

          本文标题:正则表达式学习笔记

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