写在前面
对于正则表达式,我相信很多人的都和我一样,看一眼,迷迷糊糊,要用到的时候也是直接百度现成的,知乎上关于如何学好正则表达式一致的说法都是”无他,唯手熟尔”。我们每次百度现成的就会少一次自己独立思考的机会,虽然之前有学过一丁半点,但用得少了自然也就忘得差不多了,我觉得这不利于我今后学习Python写爬虫,故写上一篇,记录关于正则表达式的一些必知必会的知识点。
先推荐一个不错的网站https://regexper.com/通过这个可视化工具将正则表达式转换成状态机,这样可以更有效地理解别人所写的正则表达式了。
必知必会的知识点
(1)字符
语法 | 说明 | 表达式 | 可匹配 |
---|---|---|---|
任意普通字符 | 匹配自身 | abc | abc |
\ | 转义字符 | a\\b | a\b |
. | 匹配除了换行符以外的任何字符 相当于\w的加强版(\w看下面一张表)可匹配空格 | .+ | a c1b |
[…] | 字符集 可以都写出来也可以写个范围如[a-z],第一个字符如果是\^表示取反,如[\^a]表示a除外的所有字符,如果字符集内有特殊字符,需要转义 | a[bc]d | abd,acd |
(2)预定义字符集
语法 | 说明 | 表达式 | 可匹配 |
---|---|---|---|
\d | 数字[0-9] | \d | 1,2,3…. |
\D | 非数字[^\d] | \D | a,b,c… |
\s | 空白字符 | a\sc | a c |
\S | 非空白字符 | a\Sc | abc |
\w | 匹配字母,数字,下划线[A-Za-z0-9_] | \w+ | a_b 1 |
\W | 匹配任意不是字母,数字,下划线 的字符 |
(3)量词
语法 | 说明 | 表达式 | 可匹配 |
---|---|---|---|
* | 匹配字符重复0次或无限次 | ab* | a,ab,abb,abbbb… |
+ | 匹配字符重复1次或无限次 | ab+ | ab, abb, abbb… |
? | 匹配字符重复0次或1次 | ab? | a, ab |
{n} | 匹配字符重复n次 | ab{2}c | abbc |
{n,m} | 匹配字符重复n到m次 | ab{1,2}c | abc, abbc |
{n,} | 匹配字符至少重复n次 | ab{2,}c | abbc |
(4)边界匹配
语法 | 说明 | 表达式 | 可匹配 |
---|---|---|---|
^ | 匹配行或字符串的开头 | ^a | a |
$ | 匹配行或字符串的结尾 | c$ | c |
\A | 匹配字符串的开头 | \Aa | a |
\Z | 匹配字符串的结尾 | c\Z | c |
\b | 不会消耗任何字符只匹配一个位置(单词边界,\w能表示的范围) | \bb\b | a b c的b,a!b!c的b |
(5)逻辑分组
语法 | 说明 | 表达式 | 可匹配 |
---|---|---|---|
| | 或,左右表达式匹配一个即可 | ab|cd | ab,cd |
(…) | 一个左右括号为一个分组,分组有自己的编号,做左到右每遇到一个左括号分组编号就+1。分组后面可接量词,在分组中的|范围也仅仅在这个分组内有效 | (a){2} | aa |
(6)特殊构造(预查)
语法 | 说明 | 表达式 | 可匹配 |
---|---|---|---|
(?:) | 非获取匹配 | a(?:bc|cd) | abc,acd |
(?=…) | 之后的内容需要匹配 | a(?=\d) | 匹配a后面是数字的字符串 |
(?!…) | 之后的内容需要不匹配 | a(?!\d) | 匹配a后面不是数字的字符串 |
(?<=…) | 之前的内容需要匹配 | (?<=\d)a | 匹配a前面是数字的字符串 |
(?<!…) | 之前的内容需要不匹配 | (?<!\d)a | 匹配a前面不是数字的字符串 |
以上是目前我总结出来的需要熟稔于心的基本的正则语法。当然,网上同样的总结也有很多,留一份供自己日后参考用。
最后演示一下我推荐的那个网站(匹配IP地址),看起来是不是很棒?一目了然