Home Regex正则表达式学习与使用
Post
Cancel

Regex正则表达式学习与使用

感觉Regex正则表达式是这样一种东西:

  • 没有需求时去学习它:天啊这一串符号都是什么东西,怎么学啊!
  • 当有需求用到它并且成功应用时:真是太方便了!真香,要学习!

动机

最近实习的时候,需要协助处理代码审查系统的告警,其中有大量(约1.6k)的命名风格的问题,需要对原有的变量命名进行批量替换。我用的编辑器是VS Code,它的朴素的字符串替换功能已经不能满足需求了,比如我需要做以下一些替换:

1
2
3
src0_32f -> vSrc0
dst0_32f -> vDst0
...

想到的是,用正则表达式匹配与替换,对于这个例子,所采用的方法是:

搜索框填:([a-z])(\w+)_32f

替换框填:v\U$1$2

真是方便!这促使我开启regex正则表达式的学习和积累。

基础

在处理字符串时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。

正则表达式的资料,网上已经有很多了,这里列举几个对我帮助比较大的:

元字符(Metacharacters)

Regex的元字符有:[] . ^ $ * + ? {} | () \

  • []:定义一个字符集合,当某一个单个字符属于该集合时,则匹配
    • 如规则[abc]作用于apple会发生一次匹配

    • 可使用-表示一个区间,如[0-9]等价于[0123456789][a-z]等价于[abcd...xyz][A-Z]等价于[ABCD...XYZ]

      • [0-39]等价于[01239]
      • [a-z0-9]等价于[abcd...xyz0123456789]
    • 使用^取集合的补集

      • [^abc]代表所有不属于[abc]的字符集合
  • .:匹配除换行符\n之外的所有单个字符
    • 如规则.作用于abcd时会发生4次匹配(分别为a, b, c, d);规则..作用于abcd时会发生2次匹配(分别为ab, cd);
  • ^:判断以后续字符/串为开头的字符/串

    • 如规则^ab作用于abc会发生匹配,作用于acb则不会发生匹配
  • $:判断以前缀字符/串为结尾的字符/串

    • 如规则a$作用于formula会发生匹配,作用于cab则不会发生匹配
  • 计数元字符:*+?{}

    • *:其左方的单个字符重复大于等于0次
      • ma*n可匹配mnmanmaaaaan
    • +:其左方的单个字符重复大于等于1次
      • ma+n可匹配manmaaaaan
    • ?:其左方的单个字符重复0次或1次
      • ma?n可匹配mnman
    • {}{m, n}表示重复大于等于m次,小于等于n
      • 比如[0-9]{2, 4}匹配长度在2~4之间的数字串
  • |:同or的含义,当某一个单个字符属于|连接的所有字符中的一个时,则发生匹配
    • 如规则a|b作用于adb时,发生两次匹配(ab
    • 感觉有点像[]
  • ():分组

    • 一个()扣起来的为一个组。当需要把匹配字符串中的某一小组提取出来,比较有用:

      • 比如要把0000_32f替换为0000_32s,则可使用:

        • 搜索框填([0-9]{4})_32f,替换框填$1_32s

          • 其中$1就表示第一组的内容(regex从1开始计数)
      • 比如要把0000_32f替换为0000_32F,则可使用:

        • 搜索框填([0-9]{4})_32(\w),替换框填$1_32\U$2

          • 其中\U表示将对应的字符转为大写
  • \:常见的转移字符的含义

特殊字符

  • \d:等价于[0-9]
  • \D:等价于[^0-9]
  • \w:等价于[a-zA-Z0-9_](注意还可匹配下划线)
  • \W:等价于[^a-zA-Z0-9_]
  • \s:匹配一个空白位置

其他

  • 在线测试正则表达式的工具:Wegester
This post is licensed under CC BY 4.0 by the author.

Python argparse使用方法小结

对Roofline模型的理解