正则表达式。
正则表达式
- what:记录文本规则的代码
元字符
匹配对象
符号 | 含义 | 解释 |
---|---|---|
. | 点号 | 匹配单个(除换行符以外)任意字符 (含空格、下划线等) |
\s | 空白/空格- space | 匹配任意的空白符 |
\S | 非空白字符 | 匹配任何非空白字符,相当于[^ fv] |
\d | 数字 - digit | 匹配数字 ,相当于[0-9] |
\D | 非数字 | 匹配任何非数字字符,相当于[^0-9] |
\w | 任何字符 - whatever | 匹配任何字母数字字符,相当于[a-zA-Z0-9_] |
\W | 非任何字符 | 匹配任何非字母数字字符,相当于[^a-zA-Z0-9_] |
[ ] | 字符组 | 匹配单个列出的字符,表示或的关系 |
[^ ] | 排除性字符组 | 匹配单个未列出的字符 |
\char | 转义字符 |
对于 ? 和 * 的对象在”匹配成功”时也可能并没有匹配任何内容。因为它们允许匹配的数量为0
即便是排除性字符,也需要匹配一个字符
转义符
\\*
第一个转义符是对\进行转义,表示:查找\*
此类字符的内容空格
也是一个字符
字符组 [ ]
字符组内匹配的是列出的单个字符,或者的关系
字符组元字符 :字符组内的元字符,其含义表示为本身的含义,即代表普通文本字符,相当于转义之后的字符(连字符 - 除外)
- 连字符 ( - )表示一个范围;【注意:只有在字符组内部,连字符( - )才是元字符】
1[0-9] # 表示匹配的字符为0~9之间的任意一个- 连字符 ( - ) 出现在字符组的开头,则仅代表普通文本字符;
1[-09] # 表示匹配的字符为 - 或者 0 或者 9
量词 - 计数功能
对前一个/一组字符匹配的的次数
符号 | 含义 | 解释 |
---|---|---|
? = 0 或 1 | 问号 | 不匹配,或仅匹配一次 |
* $\ge$ 0 | 星号 | 可能不匹配,也可能匹配任意多次 |
+ $\ge$ 1 | 加号 | 至少匹配一次,也可能匹配任意多次 |
{m} | 对于前一个字符重复m次 | |
{min, max} | 区间量词 | 对前一个字符重复min到max次 |
匹配位置
符号 | 含义 | 解释 |
---|---|---|
^ | 脱字符 | 一行的开头位置 |
$ | 美元符 | 一行的结束位置 |
\b | 单词分界符 | 匹配单词的开始或结束 (用于精确匹配) |
\D | 非单词分界符 | 匹配不是单词开头或结束的位置 |
其他元字符
符号 | 含义 | 解释 | |
---|---|---|---|
( ) | 括号 | 限定多线结构的范围; 为反向引用“捕获”文本 | |
\1 , \2 | 反向引用 | 匹配之前的第一个、第二个括号内的字表达式所匹配的文本(即捕获的文本) | |
\ | 或者 | 匹配任意分隔的表达式 |
括号与反向引用的示例
- 分组0对应整个正则表达式
1234 > \b(a-zA-Z)*+\1\b> # 若 \b(a-zA-Z)*+ 任意字符找到的以单词开头的内容为the,则\1 表示其末尾也应为the的内容> # 若有两个括号,\2表示第二个括号中所匹配的文本内容>
多选结构
使用圆括号( ) 来进行表示,而非方括号
123456# 查找 gray 或 grey的写法1. gr[ae]y2. gr(a|e)y# 错误的写法 gr[a|e]y -表示查找 a 或者 | 或者 e
多选结构可以匹配任意长度的字符,而字符组[ ]只能匹配单个字符
示例
你在一篇英文小说里查找hi,你可以使用正则表达式hi
通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种情况中的任意一种。
很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b
\bhi\b.*\bLucy\b
的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词
Python - re模块
由于Python的字符串本身也用\
转义,因此强烈建议使用Python的r
前缀,就不用考虑转义的问题了:
|
|
分组
用()
表示的就是要提取的分组(Group),进行提取子串
^(\d{3})-(\d{3,8})$
分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:
|
|
- 如果正则表达式中定义了组,就可以在
Match
对象上用group()
方法提取出子串来。- 注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串
贪婪匹配
- 正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
- 由于
\d+
采用贪婪匹配,直接把后面的0
全部匹配了,结果0*
只能匹配空字符串了。
- 由于
|
|
- 必须让
\d+
采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0
匹配出来,加个?
就可以让\d+
采用非贪婪匹配:
|
|
编译
当我们在Python中使用正则表达式时,re模块内部会干两件事情:
- 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
- 用编译后的正则表达式去匹配字符串。
如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:
|
|
使用方式为 命名的变量.方法(查找对象的范围)