0x01-前言

为什么要学这个呢,大抵是想写一个关于sqli-labs靶场的自动化脚本,对于报错回显需要捕捉页面进行提取关于正则表达式,不止于python中,任何搜索页面中的匹配都可以使用到此规则,所以正则表达式,不可缺

0x02-正则匹配基础规则

在线测试URL:[https://regex101.com/](https://regex101.com/)

限定符(Quantifier)

限定符?
例如:输入user?,就会匹配useuser,说明r可有可无
image.png
限定符
例如:`user
s,匹配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)+`
image.png

或运算(Or Operator)

A (B | C)
例如输入:pet is (dog|cat),后面括号里为或者,既可以是dog,也可以是cat
image.png

字符类(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-正则基础练习:

匹配多个单词

image.png
正则表达式:[Rr]ub[ye]

区间

有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]。
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)代表区间,依照这个规则,可以总结出三点:

  1. 要匹配任意数字可以使用[0-9];
  2. 如果想要匹配所有小写字母,可以写成[a-z];
  3. 想要匹配所有大写字母可以写成[A-Z]。

image.png
正则表达式:[0-9 a-z A-Z]

匹配转义字符

正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 -号,这个时候我们需要对-号进行转义操作,即 -。
在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 -,即 - 就代表了 - 号本身,同时转义也适用于其他符号
image.png
正则表达式:[\[\-\(]

匹配目标数据

image.png
正则表达式:[a-d 3]

取反

可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
image.png
正则表达式:爱[^你 ]
不含小写字母的数字
image.png
正则表达式:[^a-z]
快捷匹配数字和字母
image.png
正则表达式:[\d\w]
匹配空白
\s快捷方式可以匹配空白字符,比如空格,tab、换行等。
image.png
正则表达式:[code]+\s
单词边界
\b 匹配的是单词的边界
image.png
正则表达式:code\b
开始和结束
正则表达式中 ^指定的是一个字符串的开始,$指定的是一个字符串的结束
image.png
正则表达式:(OS)$
任意字符
.字符代表匹配任何单个字符,它只能出现在方括号以外。且无法匹配\n
image.png
正则表达式:.ar
可选字符
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。
这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次
image.png
正则表达式:favou?rite
可选任意字符
image.png
正则表达式:code.?j