Loading

正则表达式(一)

一、正则表达式简介

用通俗的话来讲,正则表达式是一种特殊的字符串,我们可以使用它来非常方便地对输入的字符串进行判断或信息的提取,例如我们可以使用\d+来判断这个字符串是否表示一个数字,这大大简化了我们判断字符串正误的流程也大大提高了我们提取字符信息的能力(例如可以直接使用正则表达式编写爬虫程序)。

二、正则表达式知识点

参考资料:

https://github.com/cdoco/learn-regex-zh

https://www.liaoxuefeng.com/wiki/1252599548343744

使用的正则表达式可视化平台:

https://regex101.com/

1. 元字符

各个元字符及描述如下:

元字符 描述
. 匹配除换行符以外的任意字符。
[ ] 字符类,匹配方括号中包含的任意字符。
[^ ] 否定字符类。匹配方括号中不包含的任意字符
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
{n,m} 花括号,匹配前面字符至少 n 次,但是不超过 m 次。
(xyz) 字符组,按照确切的顺序匹配字符 xyz。
` `
\ 转义符,它可以还原元字符原来的含义,允许你匹配保留字符 `[ ] ( ) { } . * + ? ^ $ \
^ 匹配行的开始
$ 匹配行的结束

1.1 英文句号.

.可以匹配除换行符以外的任意字符,例如我们可以使用a.b来匹配aoba1b等等:

image-20210915134310761

1.2 方括号[]

方括号中包括的字符构成了一个字符集,例如[0123456789]构成了包含所有数字的字符集

image-20210915134439819

例如上面的例子,[Tt]he可以匹配Thethe

而字符集中的.则单纯地代表点号,即在字符集中的元字符符号不会被当做通配符处理

此外我们希望表示1~9构成的字符集时,我们可以简写为[1-9],而字母也是同理,例如我们可以使用这个字符集来描述C语言中的标识符[a-zA-Z0-9_](即字母,数字,下划线)

1.3 否定字符集

当在方括号构成的字符集前面加上^号,例如可以这样表示非数字字符集:[^0-9]

示例:

image-20210915113338213

1.4 重复符号

表示重复的符号有下面三个:

  • *:前面的字符重复 0~n次
  • +:前面的字符重复 1~n次(即至少需要出现一次)
  • ?:前面的字符重复 0~1次(即前面的字符可出现也可以不出现,一般用于可选字符)

示例:

符号 效果
*符号 image-20210915115033809 image-20210915114145224
+符号 image-20210915114845567 image-20210915114903653
?符号 image-20210915114619992 image-20210915114503312

1.5 花括号{}

正则表达式中花括号用于表示精确的匹配次数,如数字字符出现3次,可以使用[0-9]{3}来表示。

写法有以下三种:

  • {m}:前面的字符出现m次
  • {m,n}:前面的字符出现m~n次
  • {n,}:前面的字符出现≥n次

1.6 字符组()

字符组是一组写在圆括号内的子模式 (...)

如果我们把一个量词放在一个字符之后,它会重复前一个字符。 但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。例如正则表达式 (ab)* 表示匹配零个或多个的字符串“ab”。

此外,在字符组中我们还可以使用元字符|来表示或关系,例如:

image-20210915125051183

1.7 分支结构|

我们在1.6中已经使用过|来表示逻辑或关系了,其实这个分支结构不仅可以放置在字符组中,也可以放置在最外层:

image-20210915125515351

1.8 转义特殊字符

因为许多字符被用于作为元字符了,因此这些字符如果我们希望作为正常字符进行匹配,我们则需要在它们前面加上转义符\,例如希望表示.字符,我们可以使用\.

示例(选取英文句号前第一个单词):

image-20210915125921391

1.9 定位符

定位符有两个:

  • ^:放在表达式的最前面,子串需要满足其他的表达式规则之外,还必须在输入字符串的最前面
  • $:放在表达式的最后面,子串需要满足其他的表达式规则之外,还必须在输入字符串的最后面

示例:

符号 效果
^ image-20210915130504692 image-20210915130527958
` 符号
---- ------------------------------------------------------------
^ image-20210915130504692 image-20210915130527958
image-20210915131023818 image-20210915130941589

2. 简写字符集

正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:

简写 描述
. 匹配除换行符以外的任意字符
\w 匹配所有字母和数字的字符:[a-zA-Z0-9_]
\W 匹配非字母和数字的字符:[^\w]
\d 匹配数字:[0-9]
\D 匹配非数字:[^\d]
\s 匹配空格符:[\t\n\f\r\p{Z}]
\S 匹配非空格符:[^\s]

3. 断言

后行断言和先行断言有时候被称为断言,它们是特殊类型的 非捕获组用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。 例如我们想获取输入字符串 $4.44 and $10.88 中带有前缀 $ 的所有数字。我们可以使用这个正则表达式 (?<=\$)[0-9\.]*,表示:获取包含 . 字符且前缀为 $ 的所有数字。

用通俗的话来说就是:我希望匹配的东西在某个模式(需要用正则表达式描述这个模式)的前面或者后面,例如我当前有一个html文件,我需要得到所有a标签和p标签中的内容,此时我可以使用某个表达式来描述这两个标签,进而定位匹配到标签内部的内容。

以下是正则表达式中使用的断言:

符号 描述 作用
?= 正向先行断言 结果集元素后面有这个模式
?! 负向先行断言 结果集元素后面没有这个模式
?<= 正向后行断言 结果集元素前面有这个模式
?<! 负向后行断言 结果集元素前面没有这个模式

各个断言的写法基本都是一样的,基本都是(断言符号+断言模式)

3.1 正向先行断言

例如还是这个字符串:The fat cat sat on the mat.

我们希望匹配到所有fat前面的The,我们可以这样写:

image-20210915133332455

3.2 负向先行断言

负向先行断言则是用于限制后面没有这个模式,例如希望匹配到所有后面没有\sfatThethe

image-20210915133236748

即后面凡是有这个模式的都被过滤掉。

3.3 正向后行断言

从输入字符串中获取在单词 Thethe 之后的所有 fatmat 单词:

image-20210915133958860

3.4 负向后行断言

在输入字符中获取所有不在 Thethe 之后的所有单词 cat

image-20210915134127818
posted @ 2021-09-15 13:52  CodeReaper  阅读(384)  评论(0编辑  收藏  举报