0x01-前言
为什么要学这个呢,大抵是想写一个关于sqli-labs
靶场的自动化脚本,对于报错回显需要捕捉页面进行提取关于正则表达式,不止于python中,任何搜索页面中的匹配都可以使用到此规则,所以正则表达式,不可缺
0x02-正则匹配基础规则
在线测试URL:[https://regex101.com/](https://regex101.com/)
限定符(Quantifier)
限定符?
例如:输入user?
,就会匹配use
或user
,说明r
可有可无
限定符
例如:`users,匹配
r字符出现0次或多次<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25811869/1650006579663-2368cafe-fec4-43f1-b50e-d24ea26ca368.png#clientId=u5ae203a3-82f1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=229&id=u013fae65&margin=%5Bobject%20Object%5D&name=image.png&originHeight=268&originWidth=569&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12730&status=done&style=none&taskId=uf36bccb4-1af9-4407-ace2-c3c4eb2d4ea&title=&width=486.20001220703125)<br /> 限定符+ <br />例如:
user+s,指定
r字符出现1次或多次<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25811869/1650006861046-04a37529-5eaf-4181-a223-1a29f0e313ec.png#clientId=u5ae203a3-82f1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=230&id=u6ee15f49&margin=%5Bobject%20Object%5D&name=image.png&originHeight=288&originWidth=670&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14942&status=done&style=none&taskId=u734dfc00-f4b6-4aa2-9581-1b19b0fb7c3&title=&width=536)<br />亦或者使用{....}<br />
user{3}s直接指定
r出现的次数为3次<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25811869/1650006974938-4dbf999d-50db-480a-a851-b8ca7f71f39c.png#clientId=u5ae203a3-82f1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=215&id=ue0ec0270&margin=%5Bobject%20Object%5D&name=image.png&originHeight=269&originWidth=659&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14844&status=done&style=none&taskId=u22bbcd1e-bc22-48cf-8cd6-da5f19cc95e&title=&width=527.2)<br />如果要匹配多个字符,就可以结合前面的,例如匹配
us<br />就可以写成:
(us)+`
或运算(Or Operator)
A (B | C)
例如输入:pet is (dog|cat)
,后面括号里为或者,既可以是dog,也可以是cat
字符类(Character Classes)
[]
:允许匹配一组可能出现的字符[0-9]+
:匹配所有数字[a-z]+
:匹配所有小写字符[A-Z]+
:匹配所有大写字符
都可以写在一起,意为匹配所有非空字符
但是如果在规则前加上^
,意为取反,例如[^0-9]+
匹配所有非数字字符
元字符(Meta-characters)
正则表达式中发部分字符都已反斜杠\
组成,例如:\d+
代表所有数字字符,等同于[0-9]+
\w+
代表单词字符(英文、数字、下划线)\s+
代表所有空白字符
tips:
将元字符大写例如:\D+
,\W+
,\S+
,分别意为:非数字字符;非单词字符、非空白字符.
字符是一个特殊的字符,匹配包括任意字符,换行符除外\bword
,\b
表示字符的边界(全字匹配)^a
只会匹配行首的a,$a
会匹配行尾的a
贪婪和懒惰匹配(Greedy、Lazy Match)
<.+>
默认贪婪匹配<>中任意字符<.+?>
懒惰匹配<>中任意字符
0x03-正则基础练习:
匹配多个单词
区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]。
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)代表区间,依照这个规则,可以总结出三点:
- 要匹配任意数字可以使用[0-9];
- 如果想要匹配所有小写字母,可以写成[a-z];
- 想要匹配所有大写字母可以写成[A-Z]。
匹配转义字符
正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 -号,这个时候我们需要对-号进行转义操作,即 -。
在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 -,即 - 就代表了 - 号本身,同时转义也适用于其他符号
正则表达式:[\[\-\(]
匹配目标数据
取反
可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
正则表达式:爱[^你 ]
不含小写字母的数字
正则表达式:[^a-z]
快捷匹配数字和字母
正则表达式:[\d\w]
匹配空白
\s快捷方式可以匹配空白字符,比如空格,tab、换行等。
正则表达式:[code]+\s
单词边界
\b 匹配的是单词的边界
正则表达式:code\b
开始和结束
正则表达式中 ^指定的是一个字符串的开始,$指定的是一个字符串的结束
正则表达式:(OS)$
任意字符
.字符代表匹配任何单个字符,它只能出现在方括号以外。且无法匹配\n
正则表达式:.ar
可选字符
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。
这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次
正则表达式:favou?rite
可选任意字符
正则表达式:code.?j