【10分钟入门】关于正则表达式,看这一篇就够了

发布于 2023-02-27  466 次阅读


最近接触到正则表达式,用于匹配对应的字符串,觉得很神奇,于是开始一个学习。

参考学习资料:《10分钟快速掌握正则表达式》

工具推荐

regex101: build, test, and debug regex

这个网站可以帮助我们实时地测试RegEx(正则表达式),后面的教程都在这个平台上进行。

RegExp中各种符号的用法

1.限定符

限定符仅作用与左边一个字符,或左边的一块表达式。

  • ? 表示可以出现0次或1次,也就是可有可无
  • + 表示可以出现1次或多次
  • * 表示可以出现任意次
  • {x} 表示必须出现x次,
  • {l, r} 表示出现次数必须在闭区间[l, r]之间,可以省略一个,下界默认为0,上界默认无穷

假如我要在一些字符中找出以a开头,以c结尾,中间有若干个b的字符串,可以像下面这样写:

限定符*

当然也可以这样写:

限定符{}

不难发现,前面的这些?+*都可以用{}来表达,不过为了方便就会用前面的表示。

2.“或”运算

在几乎所有编程语言中都有或运算来表示一个不太好一步表示的逻辑集合,在RegExp中也可以。

符号:| 可以将左右两个表达式取并集作为新的表达式,但优先级低于表达式的拼接

比如我要得到所有的a和an,就可以像下面这样写。注意两边要用括号和\b包围起来,\b确保这是一个单词而不是一个单词的一部分,括号是为了防止把"\ba"和"an\b"作为两个表达式,我们的表达式应该是a和an。

或 运算

3.字符类

格式:[abc]表示这一位可以是abc中的任意字符,也可以用区间来表示,比如[a-z]表示这一位可以是一个小写字母,[a-zA-Z0-9]+表示这里可以是一个或多个“大写字母或小写字母或数字”。

举个例子,我要匹配所有格式为"班级+学号"中找出所有zy02班的人,可以像下图这样做。

字符类

如果要找出所有jsj1班到3班的,可以像下面这样做。

字符类

这里的\d和[0-9]等价。值得注意的是这里的非法学号jsj0100没有被匹配到。

也可以在 [ ] 的开头添加一个 ^ 字符,表示排除。

4.元字符

  • \d 表示数字
  • \D 表示非数字
  • \w 表示字母、数字和下划线
  • \W 表示非字母、数字和下划线
  • \s 表示空白字符
  • \S 表示非空白字符
  • ^ 匹配行首
  • $ 匹配行尾

5.贪婪匹配与懒惰匹配

RegExp默认匹配模式为贪婪匹配,也就是尽可能长。

假如我在一段HTML中想要匹配出每一个<>标签,如果像下面这样写,会把整个文档作为一个长字符串匹配。

贪婪匹配

这显然不是我们想要的结果,我们就可以利用?来改为懒惰匹配。

懒惰匹配

修饰符

引用一段菜鸟教程的文章《正则表达式 – 修饰符(标记) | 菜鸟教程》,直接偷懒一手。

一般会用/g,表示global全局搜索。

在Python中使用RegEx

python需要先引入re库,这是一个很强大的字符串匹配库。

我们利用re.search(pattern, string[, flags])来做匹配,会返回一个结果组成的元组,如果没找到返回None,常用于判断。

假如我要在python中识别一段式子是一个负数,还是一个表达式时,可以这样匹配:

判断数字是否是一个浮点型负数

再举个例子,假如我要在一段html中找出所有a标签,可以像下面这样做,,re.findall返回一个list。

找出所有a标签

19岁,性别未知,ACM-XCPC退役选手,CCPC全国邀请赛金牌,ICPC亚洲区域赛银牌,武汉某院校计算机科学与技术专业本科在读。
最后更新于 2023-03-16