文章目录
前言
2021.07.18学爬虫用到,单独学习一下
2021.07.19继续搞,附上课程链接:正则表达式30分钟入门40分钟进阶(绝对能学会)。入门的学完了,今天就写到这里。虽然假期要开始了,杂事多了起来,但是进度还是有点慢,明天必须要把剩下的学完
2021.07.20上午10:30完结撒花
●两个网站
- 1.正则在线测试工具:https://regexr-cn.com/
- 2.正则练习:https://codejiaonang.com/
▶正则表达式入门
①字符组(基础入门)
-
字符组 [ ]——匹配中括号里出现的任意一个元素一次
eg1.[Pp]ython # Python||python
eg2.[Rr]ub[ye] #Ruby||ruby||Rube||rube
-
'-'表示区间
eg.[0-9], [a-zA-Z], [0-9a-zA-Z]
-
匹配特殊字符
添加转义字符
eg1.[\-] # -
eg2.[\[] # [
-
取反
- 匹配非数字
[^0-9]
‘ ^ ’——取反标识(非集)(shift + 6) - 匹配内容后面不含指定内容
n[^e] # 匹配n后面不是e的内容
# ne || nei 不可匹配;nie || nine 可以匹配
- 匹配非数字
②快捷方式
1、匹配空白
\s
快捷方式可以匹配空白字符
2、单词边界
\b
匹配的是单词的边界
3、匹配数字和小写字母
\d
匹配数字
\w
匹配字母和数字
4、快捷方式取反
快捷方式也可以取反,例如对于\w
的取反为\W
,将小写改写成大写即可,其他快捷方式也遵循这个规则。
5、开始和结束
正则表达式中:
^
指定的是一个字符串的开始(shift + 6);$
指定的是一个字符串的结束(shift + 4)。
(PS:^
作用为取反找非集时外面有[]
,而作用为开都时则没有[]
)
6、任意字符
-
.
字符代表匹配任何单个字符,它只能出现在方括号以外。 -
.
字符只有一个不能匹配的字符,也就是换行符(\n)
7、可选字符
- 使用
?
符号指定一个字符、字符组或其他基本单元可选匹配一次或零次 - eg.
favou?rite # 匹配 favorite 和 favourite ;指定的是u?
8、可选任意字符
- 以上二者的有机结合
③匹配多个数据
1、重复
- 在一个字符组后加上
{N}
就可以表示在它之前的字符组出现N次。
2、重复区间
- 我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。
这里重复区间就可以出场了,语法:{M,N}
,M是下界N是上界。 - 取间后加
?
为非贪婪模式(可能是只取区间中长度小的吗?不是很懂[应该是优先取长度短的]),正则默认为贪婪模式,优先匹配长度长的
3、开闭区间
若字符组的重复次数没有边界:
-
可以使用
+
匹配1个到无数个,使用*
代表0个到无数个。 -
即:
+
等价于{1,}
,*
等价于{0,}
。
4、匹配所有手机号码
该部分为例题,详见网站:编程胶囊
5、匹配网站地址
该部分为例题,详见网站:编程胶囊
◆入门篇总结
摘自编程胶囊的课程
实例 | 描述 |
---|---|
[Pp]ython | 匹配 “Python” 或 “python”。 |
rub[ye] | 匹配 “ruby” 或 “rube”。 |
[abcdef] | 匹配中括号内的任意一个字母。 |
[0-9] | 匹配任何数字。类似于 [0123456789]。 |
[a-z] | 匹配任何小写字母。 |
[A-Z] | 匹配任何大写字母。 |
[a-zA-Z0-9] | 匹配任何字母及数字。 |
[^au] | 除了au字母以外的所有字符。 |
[^0-9] | 匹配除了数字外的字符。 |
实例 | 描述 |
---|---|
. | 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 [.\n] 的模式。 |
? | 匹配一个字符零次或一次,另一个作用是非贪婪模式(注意:问号区分中英文【中文:? 英文:? 】) |
+ | 匹配1次或多次 |
* | 匹配0次或多次 |
\b | 匹配一个长度为0的子串 |
\d | 匹配一个数字字符。等价于 [0-9] 。 |
\D | 匹配一个非数字字符。等价于 [^0-9] 。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] 。 |
\w | 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_] 。 |
\W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_] 。 |
\b | 匹配一个长度为0的子串 |
▶正则表达式进阶
①分组与回溯引用
1、分组
-
当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
-
实现分组使用
()
即可。
2、提取p标签中的数据
<p>(.*?)</p>
3、提取学号
(\d{4})[\s\-]?(\d{4})[\s\-]?(\d{2}) #特殊字符- 表示为\-
4、提取年月日
(\d{4})[\/\-]?(\d{1,2})[\/\-]?(\d{1,2})
5、或者条件
-
使用分组的同时还可以使用 或者(or)条件。
-
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个
|
符号
6、非捕获分组
- 非捕获分组
(?:表达式)
,使用分组的功能,但不捕获数据
7、分组的回溯引用
- 分组的回溯引用,使用
\N
可以引用编号为N的分组 - eg.
<(\w)>(.*?)</\1> # 匹配<font>文本</font>
- 注意:此处的
?
为第二个作用,即非贪婪模式,匹配最近的标签
②先行断言
1、正向先行断言
- 先行断言和后行断言又叫环视,也叫预搜索
- 先行断言和后行断言总共有四种:
1、正向先行断言
2、反向先行断言
3、正向后行断言
4、反向后行断言 - 正向先行断言:
(?=表达式)
,指在某个位置向右看,表示所在位置右侧必须能匹配表达式 - eg.
- 先行断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的字符串:
(?=.*?[a-z])(?=.*?[A-Z]).+
这段正则表达式规定了匹配的字符串中必须包含至少一个大写和小写的字母。 - 密码强度的验证:
至少一个大写字母
至少一个小写字母
至少一个数字
至少8个字符
(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8}
2、反向先行断言
- 反向先行断言
(?!表达式)
的作用是保证右边不能出现某字符。
3、匹配标签
- 编写正则表达式匹配除
<p>
或</p>
之外的所有标签。 <(?!p)\w+></(?!p)\w+>
③后行断言
- 只需记住一句话:先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
1、正向后行断言
- 正向后行断言:
(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配 - eg.
2、反向后行断言
- 反向后行断言:
(?<!表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式 - eg.
3、匹配两个美元符号中的数据
- 使用正则表达式匹配所有两个$符号中的数据。
(?<!\$)\$\$[^\$](.*)\$\$(?!\$)
▶正则表达式通关测试
正则表达式的实际应用
原网站这部分内容要付费,这里不写了,溜了溜了
总结
正则这个东西,学的时候挺简单,但是要经常用,要不然就忘了,这玩意忘得太快了,要经常回来复习。