目录
本文大多内容来自深度好文: 这儿。
一 概念
正则表达式(Regular Expression)是用于描述一组字符串特征的模式,用来匹配特定的字符串,能够大幅提高处理效率。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。主要使用 grep 和 notepad++ 来验证。
二 基本要素
(1)字符类;(2)数量限定符;(3)位置限定符;(4)特殊符号。
三 正则表达式()、[]、{}的区别
正则表达式的 ()、[]、{} 有着不同的意思。
() 是为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串,(\s*)表示连续空格的字符串;圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理。
[] 是定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*表示空格或者*号];
{}一般是用来匹配的长度。比如\s{3}表示匹配三个空格,\s[1,3]表示匹配1到3个空格;
(0-9)匹配’0-9’本身。[0-9]*匹配数字(注意后面有*,可以为空)[0-9]+匹配数字(注意后面有+,不可以为空),{0-9}写法是错误的,
[0-9]{0,9}表示长度为0到9的数字字符串。
示例:
1(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一,顺序也必须一致;
2、(abc)? 表示这一组要么一起出现,要么不出现,出现那则按顺序出现;
3、(?:abc)表示找到一样abc的一组,但是不记录,不保存到变量中,否则可以通过x取第几个括号所匹配道德项;
,比如:
(aaa)(bbb)(ccc)(?:ddd)(eee)可以用1获取(aaa)匹配到的内容,而3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)
匹配到的内容,因为前一对括号没有保存变量
4.a(?=bbb)顺序环视 表示a后面必须紧跟3个连续的b
5、(?i:xxxx)不区分大小写 (?s:.*)跨行匹配,可以匹配回车符
方括号是单个匹配 字符集/排除字符集/命名字符集
示例:
1、[0-3],表示找到一个位置上的字符只能是0到3折四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符
而一对方括号只能匹配单个字符
2、[^0-3] 表示找到这个位置上字符只能是除了0到3之外的所有字符
3、[:digit:] 0-9 [:alnum] A-Za-z0-9
()和[]有本质的区别
()内的内容表示的是一个表达式,()本身不匹配任何东西,也不惜那是匹配任何东西,只是把括号内的内容作为
同一个表达式来处理,例如(ab){1,3},就表示ab一起连续出现最少1次,最多三次。如果没有括号的话,ab{1,3},
就表示a 后面紧跟的b出现的最少一次,最多三次。另外,括号在匹配模式中也跟重要。这个就不延伸了。
[]表示匹配字符在[]中,兵出现一次,并且reshuffle字符写在[]会被当成普通字符来匹配,例如[(a)],会匹配(、a、)、这三个字符。
所以()[] 无论是作用还是表示的含义。都有天壤之别,没有什么联系。
四 字符类
1 [[:xxx:]],预定义的一些命名字符类
1、[[:alnum:]]:英文大小写字母和数字;
2、[[:alpha:]]:英文大小写字母;[:lower:]:小写;[:upper:]:大写;
3、[[:digit:]]:数字;
4、[[:blank:]]:空格,tab;[:space:]:任何会产生空白的字符:空格,tab,CR;
5、[[:graph:]]:除了空格和tab意外的任何字符,等同于^[:blank:];
6、[[:print:]]:任何可以打印的字符;

2 字符
| 字符 | 含义 | 举例 |
|---|---|---|
| . | 匹配除换行符\n之外的任意一个字符 | abc.可以匹配abcd或abc6等 |
| [] | 匹配括号中的任意一个字符 | [abc]可以匹配ad,bd,cd |
| - | 在[]内表示字符范围 | [0-9a-fA-F]可以匹配一位16进制数字 |
| [^] | 匹配除[]中的字符中的任意一个字符 | [^xy]1,可以匹配a1,b1,但是无法匹配x1,y1 |
| * | 代表0个或者多个重复字符 | 例如o*,代表0到n个o都可以匹配 |
| |转义字符 | \.表示.这个字符 | |
| .* | 表示任意多个任何字符,可以相当于shell中的通配符* | |
| [ | 标记一个中括号表达式的开始。 | |
| { | 标记限定表达式的开始。 | |
| 例如: | ||
![]() | ||
| 注意:1、grep采用的贪心匹配,它会匹配当前行中的所有匹配内容;2、echo $?表示是否匹配成功(如果成功返回值为0,不成功返回值为1)。 | ||
![]() | ||
![]() |
3 非打印字符
| 字符 | 含义 | 举例 |
|---|---|---|
| \cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原意的‘c’字符。 | |
| \f | 匹配一个换页符。等价于\x0c和\cL。 | |
| \n | 匹配一个换行符。等价于\x0a和\cJ。 | |
| \r | 匹配一个回车符。等价于\x0d和\cM。 | |
| \s | 匹配任何空白字符,包括空格,制表符,换页符等等。等价于[\f\n\r\t\v] | |
| \S | 匹配任何非空白字符,等价于[^\f\n\r\t\v] | |
| \t | 匹配一个制表符,等价于\x09和\cl | |
| \v | 匹配一个垂直制表符,等价于\x0b和\cK |
4 数量限定符
| 字符 | 含义 | 举例 |
|---|---|---|
| ? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定式。 | [0-9]?\.[0-9]匹配0.0、1.7、.6等。 |
| + | 匹配前面的子表达式一次或多次。 | [a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+匹配email地址 |
| * | 紧跟在他前面的单元应匹配零次或多次 | [0-9][0-9]*匹配至少一位数字,等价与[0-9]+,[a-zA-Z_]+[a-zA-Z_0-9]*匹配C语音的标识符 |
| {N} | 紧跟在它前面的单元应精确匹配N次 | [0-9][0-9]{2}匹配100到999的整数 |
| {N,} | 紧跟在它前面的单元应匹配至少N次 | [0-9][0-9]{2,}匹配大于等于三位数的整数 |
| {,M} | 紧跟在它前面的单元应匹配最多M次 | [0-9]{,1}指最多匹配0-9之间的一个整数,相当于[0-9]? |
| {N,M} | 紧跟在它前面的单元应匹配至少N次,最多M次 | [0-9]{1, 3}\.[0-9]{1, 3}\.[0-9]{1, 3}\.[0-9]{1, 3}匹配IP地址 |
![]() | ||
![]() |
5 位置限定符
| 字符 | 含义 | 举例 |
|---|---|---|
| ^ | 表示行首的位置 | ^content匹配一行开头的content |
| $ | 表示行尾,如果设置了 | ;$匹配一行结尾的;,;$匹配空行 |
| < | 匹配单词开头的位置 | |
| > | 匹配单词结尾的位置 | |
| \b | 匹配一个字边界,即字与空格间的位置。 | |
| \B | 非字边界匹配 | |
![]() | ||
![]() |
6 特殊符号
| 字符 | 含义 | 举例 |
|---|---|---|
| () | 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符 | ([0-9]{1,3}\.){3}[0-9]{1, 3}匹配IP地址 |
| | | 连接两个子表达式,表示或的关系 | `n(o |
![]() |
7 其他普通字符及其替换
| 符号 | 替换正则 | 匹配 |
|---|---|---|
| \d | [0-9] | 数字字符 |
| \D | [^0-9] | 非数字字符 |
| \w | a-zA-Z0-9 | 数字字母下划线 |
| \W | [^\w] | 非数字字母下划线 |
| \s | [\r\n\t\f] | 表格,换行等空白区域 |
| \S | [^\s] | 非空白区域 |
| 假如我们去掉-E选项,会有什么现象呢? | ||
![]() | ||
| 此时,不难发现,去掉-E选项之后没有进行正常的正则匹配,这种现象需要我们引入如下的两个概念! |
五 使用示例
匹配文本:"fontname": b"OKFYIZ+\xcb\xce\xcc\xe5", ;
对应正则表达式:"fontname": b"(?<=").*?(?=")", 。
六 基本正则表达式&扩展正则表达式
区别:正则表达式的扩展正则(Extended规范)和基本正则(Basic规范)下,有些字符? + {} | ()应该解释为普通字符,要表示上述特殊含义则需要加“\”转义字符。反之,在扩展规范下,? + {} | ()应被理解为特殊含义,要取其字面值,也要对其进行“\”转义。
因此,grep工具带上-E选项,表示使用扩展正则来进行匹配,若没有该选项,则表示使用基准正则来进行匹配。
对于上述的问题,我们举例如下:

当目标字符串当中本身就包含了? + {} | ()字符,要想进行正则匹配,应该这样做:



综上,正则表达式有以下三个分类:1、基本正则表达式:Basic即BPEs;2、扩展正则表达式:tended即EREs;3、Perl的正则表达式:PREs。
因此,当grep指令不跟任何参数时,表示要使用BREs;“-E”表示使用EREs;“-P”参数,表示使用PREs。
七 贪婪模式与非贪婪模式
1、贪婪模式:正则表达式匹配时,会尽量多的匹配符合条件的内容。

注意:grep默认采用贪婪匹配,可能会对我们的测试结果造成干扰,大家可以上网使用“正则在线转换工具”进行测试。
2、非贪婪模式:正则表达式匹配时,会尽量少的匹配符合条件的内容,也就是说,一旦发现匹配符合要求,立马就匹配成功,而不会继续匹配下去(除非有g,开启下一组匹配)。

八 零宽断言
1、所谓断言,是用来声明一个应该为真的事实。在正则表达式中,只有当断言为真时才会继续进行匹配。
2、零宽断言:像用于查找某些内容之前或者之后的东西,其中一些特殊字符如“\b、^、$”等用于指定一个位置,这个位置应满足一定的条件。
3、分类:
(1)零宽度正预测先行断言(?=exp)
它断言自身出现的位置之后能匹配的表达式exp。如:\b\w+(?=ing\b),表示匹配以ing结尾的单词的前面的部分(除ing以外的部分)。当我们要查找“I’m singing while you’re dancing.”时,它会匹配sing和danc。

(2)零宽度正回顾后发断言(?>=exp)
它断言自身出现的位置的前面能匹配的表达式exp。如:(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除er以外的部分),例如:在查找“reading a book”时,它匹配ading。










1736





