前言:
正则表达式真是一个完美而强大的东西,之前陆陆续续地学过,但是都不是很系统地学习,所以专门抽空系统地学了一下,受益匪浅
正则表达式的使用
- 基本匹配
正则表达式abc匹配abc - 元字符
元字符都有一些特殊的含义一下是一些元字符的介绍
元字符 描述
. 点匹配除换行符以外的任意字符
[] 字符种类,匹配方括号内的任意字符
[^] 否定字符种类,匹配除了方括号里的任意字符- 匹配>=0个重复的在*之前的字符
- 匹配>=1个重复的在之前的字符
? ?之前的字符可选
{n,m} 匹配num个中括号之前的字符(n<num<m)
(xyz) 匹配与xyz完全相等的字符集
| 或运算符,匹配符号前或后的字符
\ 转义字符,用于匹配一些保留的字符{}[].^%()|等等
^ 从开始匹配
$ 从末端开始匹配
2.1 点运算符 .
点可以匹配任意单个字符,但不匹配换行符
例:s=”The fat cat sat on the mat”
re.findall(“.at”,s)的意思匹配任意一个字符后面跟着at字符串 所以匹配结果为 fat cat sat mat
2.2 字符集
方括号[]用来指定一个字符集在方括号中使用连字符来指定字符集的范围,在[]中的字符集不关心顺序,此外[.]中的’.’即为’.’’
例:s=”The fat cat sat on the mat.”
re.findall(“[Th]he”,s)的意思匹配以T或者t开头以he结尾的字符串,所以匹配结果为:The the
re.findall(“at[.]”,s)的意思匹配以at开头以’.’结尾的字符串,所以匹配结果为:at.
2.2.1 否定字符集
一般来说^表示一个字符串的开头,但它如果用在[]中表示为否定的意思
例:s=”The fat cat sat on the mat.”
re.findall(“[^t]he”,s)的意思匹配不是以t开头但是是以he结尾的字符串,所以匹配结果为:The
2.3 重复次数
+,?,*都是用来指定匹配子模式的次数
2.3.1 号 号是匹配在之前的字符出现>=0次
例:s=”The fat cat sat on the mat.”
re.findall(“[a-z]“,s)的意思匹配小写字母出现次数>=0
所以结果:[‘’, ‘he’, ‘’, ‘fat’, ‘’, ‘cat’, ‘’, ‘sat’, ‘’, ‘on’, ‘’, ‘the’, ‘’, ‘mat’, ‘’, ‘’]
注意:这里如果出现次数为0其实匹配到了空
2.3.2 +号
+号是匹配在+号之前的字符出现>=1次
例:s=”The fat cat sat on the mat.”
re.findall(“[a-z]+”,s)的意思匹配小写字母出现次数>=1
所以结果:[‘he’, ‘fat’, ‘cat’, ‘sat’, ‘on’, ‘the’, ‘mat’]
2.3.4 ?
在正则表达式中?前的字符在匹配是可有可无
例:s=”The fat cat sat on the mat.”
re.findall(“[T]?he+”,s)的意思匹配以he结尾开头是T或者不是的字符串,所以结果为:The the
2.4 {}号
在正则表达式中{}是一个量词,常用来匹配它前面字符出现的次数
例:s=”The fat cat sat on the mat tt.”
re.findall(“t{1,2}”,s)的意思匹配出现一次或者两次的t,所以结果为:[‘t’, ‘t’, ‘t’, ‘t’, ‘t’, ‘tt’]
2.5 (…)特征标群
特征群其实就是写在(…)中的子模式,换句话讲就是匹配()里面正则表达式
例:s=”The fat cat sat on the mat tt.”
re.findall(“(T|t)”,s)的意思是匹配出现以t或者T开头以he结尾的字符串所以结果为:T t
2.6 |或运算符
|运算符表示或,用作判断条件
例:s=”The fat cat sat on the mat tt.”
re.findall(“(fat|cat)”,s)意思为匹配fat或者cat所以结果为:fat cat
2.7 转码特殊字符
反斜杠\在正则表达式中用以转义跟在其后的特殊字符,因为正则表达式中有些特殊字符不表示本身的意思,反斜杠就是让他们表示本身的意思
2.9 ^号
^用以检查匹配的字符是否在所匹配字符串的开头
例:s=”The fat cat sat on the mat tt.”
re.findall(“^[Tt]he”,s)意思为匹配以he结尾以T或者t开头的字符串,并且该字符串是在原字符串开头所以结果为:The
2.10 $
$用以检查匹配的字符是否在所匹配字符串的结尾
例:s=”The fat cat sat on the mat the”
re.findall(“^[Tt]he”,s)意思为匹配以he结尾以T或者t开头的字符串,并且该字符串是在原字符串结尾所以结果为:the
简写字符集
正则表达式中也提供了一些简写简写 描述
. 换行符外的所有字符
\w 匹配所有字母数组,等同于[a-zA-Z0-9]
\W 匹配所有非字母数字,等同于[^\w]
\d 匹配数字,等同于[0-9]
\D 匹配非数字,等同于[^\d]
\s 匹配所有空格字符[\t\n\f\r\p{Z}]
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\p 匹配 CR/LF (等同于 \r\n),用来匹配 DOS 行终止符
4.1 ?=…前置约束(存在)
匹配规则:匹配的结果的后面存在满足?=…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“[tT]he(?=\sfat)”,s)的意思是匹配The或者the但同时他们后面跟着fat所以匹配结果为:The
4.2 ?!…前置约束(不存在)
匹配规则:匹配的结果后面不存在满足?!…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“[tT]he(?=\sfat)”,s)的意思是匹配The或者the但同时他们后面没有fat所以匹配结果为:the
4.3 ?<=…后置约束(存在)
匹配规则:匹配的结果的前面存在满足?=…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“(?<=the\s)(fat|mat)”,s)的意思是匹配fat或者mat但同时他们的前面必须存在the,所以匹配结果是:mat
4.4 ?<!…后置约束(不存在)
匹配规则:匹配的结果的前面不存在满足?=…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“(?<!the\s)(fat|mat)”,s)的意思是匹配fat或者mat但同时他们的前面必须没有the,所以匹配结果是:fat
一些实用的匹配规则
一个正确的网址 形如www.baidu.com or www.shanghai.gov.cn
(www.|https://|http://).\w.\w.\w.[a-z]+ 匹配
www.bai-du.gov.cn匹配学院或者大学的名字
.{2,10}(学院{1}|大学{1})(?=\s)
不断学习才能不断进步
欢迎大家和我交流安全上面的技术问题
我的邮箱:cyber-security@qq.com