正则表达式为高级文本操作提供了基础,简单来说,正则表达式能够按照某种模式匹配一系列具有相同特征的字符串。Python通过标准库中的re模块来支持正则表达式。
当我们不使用任何特殊符号,只是单纯地敲出几个字母比如“python”时,这就已经构成了一个正则表达式,不过这样最简单的正则表达式也只能匹配文本中与其一样的内容,想要更好地使用正则表达式,我们需要了解它的特殊符号与字符,最常见的特殊符号与字符被称为元字符
特殊符号 | |
re1|re2 | 匹配正则表达式re1或re2 |
. | 匹配任何字符(除了\n) |
^ | 匹配字符串起始部分 |
$ | 匹配字符串终止部分 |
* | 匹配0次或多次前面出现的正则表达式 |
+ | 匹配1次或多次前面出现的正则表达式 |
? | 匹配0次或1次前面出现的正则表达式 |
{N} | 匹配N次前面出现的正则表达式 |
{M,N} | 匹配M~N次前面出现的正则表达式 |
[...] | 匹配中括号中任意单一字符 |
[..x-y..] | 匹配x~y范围中的任意单一字符 |
[^...] | 不匹配中括号中出现的任意一个字符,包括某一范围的字符(如果出现) |
(*|+|?|{})? | 用来匹配重复出现*,+,?,{}的非贪婪版本 |
(...) | 匹配封闭的正则表达式,然后另存为子组 |
特殊字符 | |
\d | 匹配任何十进制数字,与[0-9]一致 \D 匹配一个非数字字符, 等价于 [^0-9] |
\w | 匹配任何字母与数字字符,与[A-Za-z0-9_]相同 \W与之相反 |
\s | 匹配任何空格字符,与[\n\t\r\v\f]相同 \S与之相反 |
\b | 匹配任何单词边界,更精确地说,\b 匹配这样的位置:它的前后字符不全是 \w \B与之相反 |
\N | 匹配已保存的子组N |
\c | 逐字匹配任何特殊字符c,即仅按照字面意义匹配,不匹配任何特殊含义 如\.,\\,\* |
\A(\Z) | 匹配字符串的起始(结束) |
扩展表示法 | |
(?i) | 忽略大小写 |
(?L) | 字符集本地化 |
(?m) | 实现多行同时匹配 |
(?x) | 允许正则表达式换行 |
(?:...) | 表示一个匹配不用保存的分组 |
(?P<name>...) | 向一个仅由name标识而不是数字id标识的正则分组匹配 |
(?P=name) | 在同一字符串中匹配由(?P<name>)分组的之前的文本 |
(?#...) | 表示注释,忽略所有内容 |
(?=...) | 匹配条件是如果...出现在之后的位置,而不使用输入字符串; 称作正向前视断言 |
(?!...) | 匹配条件是如果...不出现在之后的位置,而不使用输入字符串; 称作负向前视断言 |
(?<=...) | 匹配条件是如果...出现在之前的位置,而不使用输入字符串; 称作正向后视断言 |
(?<!...) | 匹配条件是如果...不出现在之前的位置,而不使用输入字符串; 称作负向后视断言 |
(?(id/name)Y|N) | 如果分组提供的id或name存在,就返回正则表达式的条件匹配Y, 反之就返回N;|N是可选项 |
- 如果“?”紧跟在任何使用闭合操作符的匹配后面,它将直接要求正则表达式引擎匹配尽可能少的次数
- 如果希望某个结果能被重复调用或是被提取出来用于后续处理,就用圆括号将需要的部分括起来,可以使用group()方法访问每个独立地子组以及groups()方法获取一个包含所有匹配子组的元组
- re模块支持多个线程共享同一个已编译的正则表达式对象,也支持命名子组