4.2.1 正则表达式的语法
正则表达式是对字符串操作的一种逻辑公式,它会将事先定义好的一些特定字符以及他们的组合组成一个规则字符串,并且通过这个规则字符串表达对给定字符串的过滤逻辑。
一条正则表达式也称为一个模式,使用某个模式可以匹配指定文本中与表达式模式相同的字符串。正则表达式由普通字符、元字符或预定义字符集组成。
1.元字符
在正则表达式中,元字符是指具有特殊含义的专用字符,主要用于规定其前导字符在给定字符串中出现的模式。
表4-1 常用的元字符
元字符 | 说明 |
. | 匹配任何一个字符(除换行符外) |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
| | 连接多个子表达式,匹配与任意子表达式模式相同的字符串 |
[] | 字符组,匹配其中出现的任意一个字符 |
- | 连字符,匹配指定范围内的任意一个字符 |
? | 匹配其前导字符0次或1次 |
* | 匹配其前导字符0次或多次 |
+ | 匹配其前导字符1次或多次 |
{n} | 匹配其前导字符n次 |
{m,n} | 匹配其前导字符m~n次 |
() | 分组,匹配子组 |
以下通过列举一些实例来说明表4-1中元字符的用法。
- J.m:匹配以“J”开始、以“m”结尾的字符串,匹配结果可以为J#m、Jim、J2m等。
- ^py:匹配以“py”开始的字符串,匹配结果可以为python,pyinstaller等。
- on$:匹配以“on”结尾的字符串,匹配结果可以为python、moon等
- a|b|c|d:匹配字符串中“a”,“b”,“c”或“d”。
- [cC]hina:匹配以“c”或“C”开头、以“hina”结尾的字符串,匹配结果可以为China或者china。
- [A-Z]hina:匹配A~Z的任意一位大写字母,匹配结果可以为China。
- June?:匹配元字符“?”前的字符“e”0次或1次,匹配结果可以为june或者july。
- ht*p:匹配字符“t”0次或者多次, 匹配看结果可以为hp、htp、http、htttp等。
- ht+p:匹配字符“t”1次或者多次,匹配结果可以为htp、http或httttp。
- ht{2}p:匹配字符“t”2次,匹配结果可以为http。
- ht{2,4}p:匹配字符“t”2~4次,匹配结果可以为http、htttp或htttp。
- Feb(ruary)?:匹配子组“ruary”0次或1次,匹配结果可以为Feb或Febuary。
2.预定义字符集
在正则表达式中,除了前面介绍的元字符之外,还预定义了一些字符集。这些字符集以更加简洁的方式描述了一些由普通字符和元字符组合的模式。
预定义字符集 | 说明 |
\w | 匹配下划线"_"或者任何字母(a~z,A~Z)与数字(0~9) |
\s | 匹配任意的空白字符串,等价于[<空格>\t\r\n\f\v] |
\d | 匹配任意数字,等价于[0-9] |
\b | 匹配单词的边界 |
\W | 与\w相反,匹配非字母或数字或下划线的字符 |
\S | 与\s相反,匹配任意非空白字符字符的字符,等价于[^\s] |
\D | 与\d相反,匹配任意非数字的字符等价于[^\d] |
\B | 与\b相反,匹配不出现在单词边界的元素 |
\A | 仅匹配字符串开头,等价于^ |
\Z | 仅匹配字符串结尾,等价于$ |