前言
正则表达式是一套规则,常用于字符串的查找、匹配、替换等操作,通常用来进行数据清洗。正因为是一套规则,正则表达式并不只适用于Python,也适用于C、C++、Java等编程语言。
今日份关键词:正则表达式基础
一、元字符
代码 | 说明 | 举例 |
---|---|---|
. | 匹配除换行符(\n)以外的任意字符 | . 可以匹配“OK/nfine/tR”中的字符O、K、f、i、n、e、/t、R |
\w | 匹配字母、数字、下划线或汉字 | \w 可以匹配“好6wk\nd”中的“好、6、w、k、d”,但不能匹配"\n" |
\W | 匹配除字母、数字、下划线或汉字以外的字符 | \W 可以匹配“好6wk\nd”中的“\n”,但不能匹配“好、6、w、k、d” |
\s | 匹配任意的空白符(包括\n和\t) | \s 可以匹配"xiao\tX"中的"\t" |
\S | 匹配除单个的空白符(包括\n和\t)以外的字符 | \S 可以匹配xiao\tX"中的"x,i,a,o,X" |
\b | 匹配单词的开始或结束,在内容左侧时表示匹配单词的开始,在内容右侧时表示匹配单词的结束,单词的分界符通常是空格、标点符号或者换行 | \bw 匹配“What is this?word”字符串中的what和word中的w s\b 匹配“What is this?word”字符串中的is和this中的s |
\B | 与\b相反,在内容左侧时表示匹配单词的结束,在内容右侧时表示匹配单词的开始,单词的分界符通常是空格、标点符号或者换行 | \Bs 匹配“What is this?word”字符串中的is和this中的s w\B 匹配“What is this?word”字符串中的what和word中的w |
\d | 匹配数字0~9,相当于[0-9] | \d 匹配“hao7”中的7 |
\D | 匹配非数字(包括空格、\n、\t、\r等) | \d 匹配“hao7\t”中的h、a、o、\t |
^ | 匹配字符串的开头。在多行模式中,匹配每一行的开头 | ^w 匹配“what is this?word”中的what中的w,而不能匹配word中的w |
$ | 匹配字符串的末尾。在多行模式中,匹配每一行的末尾 | e$ before pressure中的pressure中的e,而不能匹配before中的e |
二、相对精确限定符
限定符 | 说明 | 举例 |
---|---|---|
* | 匹配前面的字符零次或更多次 | yyd*syou,该表达式可以匹配的范围从yysyou到yyd…syou |
+ | 匹配前面的字符一次或更多次 | yyd+syou,该表达式可以匹配的范围从yydsyou到yydd…syou |
? | 匹配前面的字符零次或一次 | yyds?you,该表达式可以匹配yydsyou和yydyou |
{x} | 匹配前面的字符x次 | yyd{3}syou,该表示式只匹配yydddsyou |
{x,} | 匹配前面的字符最少x次 | yyd{3,}syou,该表达式只匹配yydddsyou到yyddd…syou |
{x,y} | 匹配前面的字符最少x次,最多y次 | yyd{3,5}syou,该表达式只匹配yydddsyou、yyddddsyou、yydddddsyou这3种情况 |
三、数字或字符
代码 | 说明 | 举例 |
---|---|---|
[…] | 字符集,其中的字符可以逐个列出,也可以列出范围 | [my] 匹配“mysoft”中的“m、y” [a-d] 匹配“abcdefg”中的"a、b、c、d" [0-9] 则匹配数字0到9 |
[^…] | 将^放在字符集的开始位置,表示排除字符集中所列字符 | [^my] 匹配“mysoft”中的“s、o、f、t” [^a-d] 匹配“abcdefg”中的"e、f、g" |
四、特殊符号
4.1 转义字符 \
- 原字符串:
https://www.baidu.com
- 使用转义字符:
https://www\.baidu\.com
以此来避免歧义。
4.2 条件分支 |
符号 | 说明 | 举例 |
---|---|---|
| | “或”操作,表示左右表达式任选一个,总是先匹配左表达式,如果成功,就不再匹配右表达式 | Hello|世界:将匹配字符串“Hello,world,世界”中的Hello和世界” \w{2}|\w{3}|\w{4} 可以匹配姓名2个字到4个字,例如李明,欧阳修、西门吹雪等 |
PS:在使用 | 进行或操作时,| 的左右两侧不允许有空格
4.3 分组符号()
分组符号的简单应用: 2022-04-20 13:34:30
使用分组匹配出年月日:(\d{4}-\d{2}-\d{2})
常用的分组符号
符号 | 说明 | 举例 |
---|---|---|
(...) | 分组,被小括号括起来的表达式将被看作为一个分组,如果表达式中使用 | ,则只在该组中有效 | (\.[0-9] {1,3}){3} 匹配127.0.0.1 中的.0.0.1。在使用re.findall()方法匹配时,结果为 .1 |
(?:…) | (…)的不分组版本,用在使用 | 或者后接限定符时 | (?:\.[0-9] {1,3}){3} 匹配127.0.0.1 中的.0.0.1。在使用re.findall()方法匹配时,结果为 0.0.1 |
(?=…) | 之后的字符串内容需要匹配表达式才算匹配成功 | T(?=\d) 匹配“5T和T5"中的T5中的T |
(?<=…) | 之前的字符串内容需要匹配表达式才算匹配成功 | (?=\d)T 匹配“5T和T5"中的5T中的T |
(?!..) | 之后的字符串内容需要不匹配表达式才算匹配成功 | T(?!\d) 匹配“5T和T5好"中的"5T和”中的T |
(?<!..) | 之前的字符串内容需要不匹配表达式才算匹配成功 | (?<!\d)T 匹配“5T和T5"中的“和T5”中的T |
五、模糊限定符
符号 | 说明 |
---|---|
*? | 重复任意次,尽可能少重复 |
+? | 重复1次或更多次,尽可能少重复 |
?? | 重复0次或者1次,尽可能少重复 |
{x,y}? | 重复x到y次,尽可能少重复 |
{x,}? | 重复x次以上,尽可能少重复 |
六、简单举例
- \d{5} 表示匹配5个数字
- \w{20} 表示匹配20个字符
- \w+ 表示匹配1个或多个字符
- .*? 表示匹配任意字符任意次数,尽可能减少重复
总结
今天主要总结了正则表达式在爬虫中可能用到的一些基础知识。本来想敷衍了事,但越写越觉得亏,都写了那么多了,要不再写写?于是一边写一边整合资料,写写党永远不亏(emo)。由于篇幅略多,下一节再更新正则表达式在爬虫中的常用方法。(ps.如果有写错的部分,请不吝赐教,不胜感激)