下定决心学习了一下正则!

这东西很带劲!但是会不会又忘记呢?

Posted by tianchen on January 12, 2020

Regular Expression 正则表达式学习

Resources


Rules

Re规则和find -name的显著区别有: 对于名字比待匹配字数多出来的不用加*

元字符


  • 对特殊字符,用\转义
    • 当然放到[]里面好像也可以其效果
  • 锚点(Anchor)
    • ^从开始开始匹配 $ 从末尾开始匹配
      • 这种规则是只能匹配开头第一个字母或者是末尾的字母
      • 比如r'the$'就匹配不出来,因为the不在最后
  • 基础匹配
    • . 任意单个字符
    • [$CHAR_TO_INCLUDE] 中括号内部的字符可以匹配
      • 其实或运算符和这个效果类似? |
    • [^($CHAR_TO_EXCLUDE)] 中括号内部的字符不出现
  • 重复的次数
    • * 之前的字符出现0或者更多次
      • 匹配at其中t有一个或者更多,所以att可以被匹配
    • + 前面的字符>0个的字符
    • ? 表示前面的字符出现0或者是1次
        • 所以a也可以被匹配
    • 直接的at相当于每个字符都是限定出现一次
    • {}可以直接表示有多少个
      • 单纯的{}表示对某个字符出现可以出现多次,加上()就是可以对多个字符出现多次
CHARS Usage
. [] ^ $ 用作匹配
* + ? {} 在匹配后面表示上一个匹配的次数
  • 简写字符
    • 记录一下经常用到的

         
      \w 所有字母和数字
      \W 所有非字母的数字
      \d 所有数字
      \s 所有空格
  • ~~ 修饰符号 ~~
    • i (使用的时候必须转义) 忽略大小写
    • (在Python demo里没有搞定,可能不支持?)
  • 贪婪以及惰性匹配 - ?
    • 默认是贪婪匹配,会包括尽量多的元素
    • 可以通过(),改为惰性匹配

在命令行当中,默认的grep以及egrep都是不支持的,需要用perl的grep - grep -P 注意一下grep的惰性匹配是从前往后的 正确的办法 journalctl -q | grep -P "\ \w+ms" journalctl -q | grep -P "\ [^ ]*ms"

  • Groups

如果我想要类似scanf的功能怎么办?

  • <?P<group_name>>去匹配
    • 圆括号内是需要匹配的内容,如果有限制可以加在尖括号后面,比如[1,2,3]啊或者是+啊之类的
    • 对于re.search来说,搜索出来的结果会直接在 re.find(r’‘,s0).groups(“$GROUP+NAME”)当中
    • 例子
  • 如果当前正则就需要用到匹配出来的这个group,在之后用(?P=$GROUP_NAME)来调用
    • Example
    • 上面的例子,匹配两个引号之间的Vincent作为name,后面接一个任意字符,再后面接这个name的Pattern才会被匹配
  • 如果需要在re.sub中调用name,则需要写"\g<name>"

Example

  • r'[[](.*?)[]]', 匹配[]中的0个或者更多个,且之前的[只能出现0或1个(来避免直接索引到跨多个括号情况)
    • (.*?)表示两个括号内的内容,.表示是任意字符,*?比较特别,有一个”as few as possible”的意思,叫做Lazy Quantifier
      • 0个或者是1个”[“,搭配上固定的一个”]”

Application

  • Python OS 库
  • BASH指令 grep -E
    • ll | grep -E py$

Python Re

  • params = re.findall(r'[[](.*?)[]]', $STRING) 返回一个list,匹配正则内部的内容
    • 寻找多个
    • 直接返回一个list
  • re.match(r'', $STRING) & re.search(r'', $STRING)
    • 内容现在作为一个list在返回值的return_value.group()
    • match默认从开头开始索引,而search不是,但是两者都会找到第一个,然后就返回
  • pattern = re.compile(r' ')可以将某个正则表达式编译为一个规则(但是我们通常可以不这么做)
    pattern = re.compile(r'[t|T]he')
    result = pattern.match(string)
    print(result.group())
  • result = re.sub(r'',"$STRING_TO_REPLACE, %STRING)替换