因为有很多的数据需要使用正则表达式去匹配,一般都是在网上直接搜索一个,但是也是有很多正则表达式是搜索不到的,所以不得不要自己学习一下正则表达式了.这个笔记的学习素材都是来自于胶囊网络,我是害怕自己忘记,所以就写了这个笔记.
1.正则表达式的工具
- 正则在线测试工具:https://regexr-cn.com/
- 正则练习网站:https://codejiaonang.com/
2.正则表达式
2.1 字符匹配
表达式: regex=“[Pp]thon”
中括号中的内容可以选择匹配,后面的字符是一定会匹配的。
例如:
Python3
python3
ython
2.2 匹配区间
- 匹配数字
表达式: regex=“[0-9]” - 匹配小写
表达式: regex=“[a-z]” - 匹配大写
表达式: regex=“[A-Z]” - 匹配大小写
表达式: regex=“[a-zA-Z]”
例如匹配字母数字混合体regex=“[0-9a-zA-Z]”
abcdefg&&&
012345678***
987654321%%%
ABCDEFG***
2.3 匹配特殊字符
- 匹配特殊字符
表达式: 将表达式使用反斜杠【\】进行转义,就能识别了
例如匹配下列特殊字符regex=“[][-()]”
[]
()
2.4 取反
如果想匹配除了你要匹配的内容之外的其他内容,可以使用一个^进行取反
例如匹配爱后面不包含你的数据,regex=爱[^你]
爱吗
爱哦
爱我自己
爱了
我爱我
我爱你
爱你
爱你爱你
不爱你
爱你一万年
2.5 快捷匹配
- \w:与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
- \d:与任意数字匹配
例如使用快捷方式匹配下列的所有的单词
master
code
jiaonang
123456789
987654321
0123
CODE
JIAONANG
hello world
python
2.6 特殊匹配
- \s:匹配空白
- \b:匹配单词的边界
- ^开头。匹配字符串开头,或者当使用多行标志(m)时,匹配一行的开头。
- $结尾。匹配字符串结尾,或者当使用多行标志(m)时,匹配一行的结尾。
例如匹配下面有空白的code单词,regex=“code[\s]”
code
code jiaonang
code jiaonang
code www
code jiaonang
例如匹配下列被分割的单词code,regex=“\bcode\b”
code
code jiaonang
code.jiaonang
www.code
code-jiaonang
CODEINFO
codeasd/
codejiaonangA$
JIAONANG-MASTER
CODEJIAONANG!
例如匹配所有的小数,regex=“^\d{1,}.\d{1,}$”
192.168
12.12.12.
所有快捷方式的取反就是将小写变大写就可以了,例如:\W \D \S
2.7匹配开头和结尾
匹配开头用^,匹配结尾用$
例如:匹配以python开头句子,regex=“^python”
python 12344 Python
居家闪客快打python
例如匹配以python结尾的单词,regex=“python$”
python 12344 python
还是说python
2.8 任意字符
匹配任意字符可以用点【.】,但是不能匹配换行符号【\n】,【.*】就是匹配任意字符。
例如匹配任意字符之后但是ar的字符串,regex=“.ar”
ear
car
parked
garage
barked
rar
haarr
in the
ar
aer
acer
ha ha
anr
and
2.9 可选字符
可选字符就是可以匹配也可以不匹配的字符,在这个字符后面加 一个问号,表示可选可不选
例如:有的单词有两种表达方式,需要同时匹配这两种,例如同时匹配employ和employee,regex=“employe?e?”
employe
employee
employf
2.10 匹配重复数字
在你要匹配的字符后面加一个花括号,花括号里面填写你要重复的次数,
例如匹配下列的电话号码,regex=\d{3}-\d{5}
010-88480
020-72813
030-12345
020-66666
030-98788
030-88888
123-123
01-72813
0-12345
20-66666
0-98788
0–808888
2.11 匹配区间
在要匹配的字符后面加一个区间{数字1,数字2},一般都会按照最大的那个区间匹配,如果加一个?,表示非贪婪模式,就会按照最小的那个区间去匹配.
例如匹配下面的数字,regex=“\d{8,9}”
4566545223
45664585
4552233
例如:使用正则表达式提取电话号码,假设电话号码有两种规则:
- 以3个数字开头,后面7个数字,例如:020-7281333
- 以4个数字开头,后面7个数字,例如:0731-8283431
regex=“\d{3,4}-\d{7}”
2.12 速写
*逗号:表示0到无穷大
- 加号:表示1到无穷大
例如匹配下面任意长度的数字:regex=“\d{1,}”
4566545223
45664585
4552233
例如匹配下列以f开头的数据,regex=“f.+”
f0asd…a123—
food
father
faker
fooder
fufufu
f
brather
brathef
arathef
codejiaonang
mastercode
3.正则表达式进阶
3.1 分组
在你要匹配的数据前后加一个括号就是你要提取的数据
- 例如:提取学生的电话号码:regex=“(\d{4})-(\d{7})”
张三: 0731-7839932
45664585
4552233
- 例如提取HTML表达式<div>中的内容:regex=“<div>(.*)</div>”
<div> hi</div>
- 例如提取学号:
有些学校的学号是由多个关键信息组成的,例如:2019-5013-08 2019表示入学年份,5013表示班级代码,08表示班级中的排序。
regex=“(\d{4})[-\s]?(\d{4})[-\s]?(\d{2})”
其中中间可以是-做分隔,也可以是空格做分隔,也可没有任何分隔,则用[\s-]?表示
2019-5013-08
2019 5013 08
2019501308
3.2 或者条件
用或符号【|】做分割就可以了
例如提取下面.mp4、.avi、.wmv、.rmvb等视频格式
regex=“(.mp4|.avi|.wmv|.rmvb)”
1.avi
abc.mp4
chapter1.wmv
chapter2.rmvb
3.3非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。
例如只要捕获下列的电话号码,但是不要捕获区号regex=“(?:\d{2}|\d{4}|tel)[-:](\d{5})”
01-75855
0731-75855
12345-75855
tel:75855
3.4 分组的回溯引用
因为在识别HTML标签的使用,使用下面的表达式,会识别前后不一致的HTML标签.
例如:regex=“<\w+>(.*?)</\w+>”
# 全部会被识别
123<font>提示</font>abj
123<font>提示</bar>abj
如果使用回溯,就只会识别前后一致的标签
例如:regex=“<(\w+)>(.*?)</\1>”
其中\1代表第一个分组的内容,\2就代表第二个斜杠中的分组
# 就只会识别这衣蛾
123<font>提示</font>abj
3.5 先行断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
正向先行断言
反向先行断言
正向后行断言
反向后行断言
- 正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式.
例如匹配喜欢两个字,但是喜欢的后面一个必须是你,regex=“喜欢(?=你”
喜欢你 喜欢他 喜欢我 喜欢 喜欢你
- 反向先行断言(?!表达式)的作用是保证右边不能出现某字符。
例如匹配喜欢后面没有你的喜欢
regex=“喜欢(?!你)”
喜欢你 喜欢他 喜欢我 喜欢 喜欢你
3.6 后行断言
先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
- 正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)。
- 反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)。
4.正则表达式的案例
4.1 匹配所有手机号码
手机号码的规则:
- 以数字1开头
- 第2位只能是345678
- 长度为11位
得到正则表达式为:regex=“^1[345678]\d{9}”
4.2 判断密码中是否有数字大小写字母
- 判断数字:regex=“(?=.*?[0-9])”
- 判断大写regex=“(?=.*?[a-z])”
- 判断小写regex=“(?=.?[A-Z])"
得到正则表达式为:regex="(?=.?[a-z])(?=.?[A-Z])(?=.?[0-9]).+”