正则表达式三要素
正则表达式有三种元素需要提及,分别是:字符、量词、位置。
[0-9]{4}$
这一串正则表达式的意思是要匹配出现在行尾的四个数字。
[0-9] #表示需要匹配的是数字
{4} #表示需要匹配的是四个字符
$ #表示需要匹配的字符出现在行尾
三要素之一:字符
正则表达式中的字符
字符 | 含义 | 描述 |
---|---|---|
. | 代表一个字符的通配集 | 除了换行符外的任何字符 |
[ ] | 字符集 | 和[ ]内部的任何字符匹配,默认为一个字符。里面可以是字符的集合,也可以是字符的范围。比如:[abc]、[a-z]、[0-9]。 |
[^] | 排斥性字符集 | 表示与字符集之内的其他任一字符相匹配。比如:[^0-9]表示的是非数字 |
\ | 转义符 | 特殊符号需要转义,还有其他\n、\f、\r、\t、\v。 |
\d | 表示数字 | 等价于[0-9] |
\D | 表示非数字 | 等价于[^0-9] |
\w | 字母、数字、下划线 | 包含汉字字符 |
\W | 非字母、非数字、非下划线 | 等价于[^\w] |
\s | 空白字符 | 等价于[\n\f\r\t\v] |
\S | 非空白字符 | 等价于[^\s] |
字符举例和解释
举例在下面的例子当中会有。
三要素之二:量词
正则表达式中的量词
量词字符 | 含义 | 描述 |
---|---|---|
{n,m} | n个到m个 | |
{n} | n个 | |
* | 零个或多个 | 相当于{0,} |
+ | 一个或多个 | 相当于{1,} |
? | 零个或一个 | 相当于{0,1} |
*? | 零个或多个,非贪婪 | 相当于{0,},非贪婪 |
+? | 一个或多个,非贪婪 | 相当于{1,},非贪婪 |
量词举例和解释
* 、+ 、?是在贪婪模式下进行匹配;
*? 、+? 是非贪婪模式下进行匹配。
(下面的例子对贪婪模式和非贪婪模式作了简单解释和举例)
比如:字符串为 “ab123cd” ,那么 [0-9]+ 表示的是尽量找数字,那么找到的数字会是 “123” (贪婪模式); [0-9]+? 表示的是找到数字就好,尽量少地进行匹配,那么它会找到的是 “1” (非贪婪模式)。
如果用一个较复杂而且可以直观参考用法的简单例子的话,可以参考字符串为“<div>abcdef</div>”,那么要是使用<.>的话会匹配到“<div>abcdef</div>”;而使用<.?>匹配到的结果是
"<div>"和“</div>”。
三要素之三:位置
正则表达式中的位置
一些表达式元素可以限定字符所出现的位置
位置字符 | 含义 | 描述 |
---|---|---|
^ | 起始位置 | ^[0-9]表示位于行开头的第一个数字 |
$ | 结束位置 | .$表示匹配结尾处的点(\是转义符) |
\b | 单词边界(单词首或尾) | \bclass 表示匹配 class,但是不匹配subclass |
\B | 非单词边界 | |
\A | 整个文本起始位置 | |
\Z | 整个文本结束位置 |
位置举例和解释
比如:
(1) \s+$ 表示结尾处的一个或者多个空白。
(2) ^[a-z0-9.@]+$ 表示要匹配的是从开始到结束中间只有数字,字母,点和”@“符号。
三要素之外一:分组
正则表达式中的分组
字符 | 含义 | 描述 |
---|---|---|
| | 或者 | 或关系的逻辑选择,可与组结合使用 |
( ) | 分组 | 按照子表达式进行分组 |
(?P<name>……) | 对组进行命名 | 命名后方便指定哪一个组 |
\数字 | 引用某一分组 | \1表示第1组,\2表示第2组 |
(?P=name) | 引用某个命名的组 | 按名字引用 |
分组举例和解释
比如:
(1) [a-z]+|h[1-6] 表示的是字母组成的单词或者h1,h2……h6。
(2) ([0-9]{4})-(1?[0-9])-([1-3]?[0-9]) 表示的是年月日的正则表达式。每个括号对印了一个分组。分组称为group。group(0)代指匹配到的所有字符。group(1),group(2),group(3)分别对印了匹配到的从左到右圆括号里面的内容。
(3) (?P<year>[0-9]{4})-(?P<month>1?[0-9])-(?P<day>[1-3]?[0-9]) 表达式匹配的内容和上面的例子(2)一样。但是在表达式中增加了对命名进行分组的一个操作。当这个正则表达式用来匹配 2021-5-9 的时候,group(0) 匹配到的是全部:2021-5-9;group(“year”) 匹配到的是:2021;group(“month”) 匹配到的是:5;group(“day”) 匹配到的是:9。
三要素之外二:引用
正则表达式中的引用
在正则表达式中如果要引用某一组的话可以用 \1, \2 的方法来进行引用。其中前面是一个斜杠 “”,后面是分组的数字。同时也可以利用引用命名的方法进行引用
分组举例和解释
首先,解释用含有分组数字的方法进行引用的引用方法。有两个待匹配的字符串:“<h1>ab123cd</h1>”,“<h1>ab123cd</h2>”。如果用 <(h[1-6])>.?</(h[1-6])> 那么可以匹配到的是两个字符串。但是如果用 <(h[1-6]>.*?</\1> 可以直接匹配到第一个字符串。
其次,解释使用分组命名来进行引用的引用方法。例子依然是上面的两条字符串。我们如果只想匹配到第一条字符串 <h1>ab123cd</h1> 的话,我可以这么写正则表达式:<(?P<name>h[1-6]>.*?</(?P=name)>。
结束
至此,我们简单学习了正则表达式的构成,具体的正则表达式的书写需要大家自己进行练习和操作。
参考书籍
1、《Python程序设计》—唐大仕 编著—电子工业出版社