1、概念
正则表达式(Regular Expression)是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑;
2、re模块
Python中有内置的re模块,来实现正则表达式
简单用法re.match(r”表达式”, “string”)返回的是一个re对象,需要使用group()来查看具体刷选出的值;
3、普通字符
数字、字母、下划线、汉字以及没有特殊意义的符号称为普通字符;
4、元字符
| 符号 | 含义 | 举例 |
|---|---|---|
| . | 代表除了换行符/n以外的任意一个字符 | a.b 匹配a除\n外任意字符b |
| | | 逻辑或操作符 | ab|cd 匹配ab或bc |
| [] | 匹配方括号中的一个字符 | [123] 匹配1、2、3、4 |
| [^] | []的取反 | [^123] 匹配除了1、2、3外的任意字符 |
| - | 定义[]中的一个区间 | [a-z1-9] |
| \ | 对紧跟其后的字符进行转义,使其失去特殊意义 | \. 表示一个点 |
| () | 对表达式进行分组 |
5、转义字符
一些无法书写或具有特殊功能的字符,采用在前面加斜杠进行转义的方式;
| 符号 | 含义 |
|---|---|
| \r \n | 回车符、换行符 |
| \t | 制表符 |
| \\ | 一个反斜杠 |
| \^ | 一个^符号 |
| \$ | 一个$符号 |
| \. | 一个小圆点 |
尚未列出的还有问号?、星号*和括号等其他的符号。所有正则表达式中具有特殊含义的字符在匹配自身的时候,都要使用斜杠进行转义。这些转义字符的匹配方法与普通字符类似,也是匹配与之相同的一个字符。
6、预定义匹配字符集
是已经匹配好了的特定字符集;
| 符号 | 含义 |
|---|---|
| \d | 匹配数字0-9中的一个 |
| \w | 匹配数字(0-9)、字母、下划线中的任意一个 |
| \s | 匹配空格、制表符、换页符 |
| \D | \d的反集 |
| \W | \w的反集 |
| \S | \s的反集 |
7、重复匹配
将一个表达式重复匹配指定次数次,而不是一次;针对的是其前面的一个字符,而不是全部字符;
| 符号 | 含义 |
|---|---|
| {n} | 重复匹配n次 比如\d{2}相当于\d\d |
| {m,n} | 表达式至少重复m次,最多重复n次。比如ab{1,3}可以匹配ab或abb或abbb |
| {m,} | 至少重复m次,最多无上限,比如\w\d{2,}可以匹配a12,_1111,M123等等 |
| ? | 表达式至少重复0次,最多重复1次,相当于{0,1} |
| + | 表达式至少重复1次,相当于{1,} |
| * | 表达式至少重复0次,相当于{0,} |
8、位置匹配
| 符号 | 含义 |
|---|---|
| ^* | 匹配以*开头 |
| *$ | 匹配以*结尾 |
9、贪婪与非贪婪匹配
在重复匹配时,正则表达式默认总是尽可能多的匹配,这被称为贪婪模式;
在修饰匹配次数的特殊符号后再加上一个?问号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的”不匹配”。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再多匹配一些,以使整个表达式匹配成功。
import rehtml_content = '''<p>hello</p><p>你好</p><p>hi</p>'''r = re.match(r"<p>.*?</p>", html_content, re.S)print(r.group())
10、常用正则表达式
| 功能 | 表达式 | |
|---|---|---|
| 数字 | ^[0-9]*$ |
|
| n位的数字 | ^\d{n}$ |
|
| 至少n位的数字 | ^\d{n,}$ |
|
| 零和非零开头的数字 | `^(0 | [1-9][0-9]*)$` |
| 有两位小数的正实数 | ^[0-9]+(.[0-9]{2})?$ |
|
| 非零的负整数 | ^-[1-9]\d*$ |
|
| 非负浮点数 | ^\d+(\.\d+)?$ |
|
| 浮点数 | ^(-?\d+)(\.\d+)?$ |
特殊场景的表达式:
| 功能 | 表达式 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Email地址 | ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
||||||||||||||||||||
| 域名 | [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? |
||||||||||||||||||||
| 手机号码 | `^(13[0-9] | 14[5 | 7] | 15[0 | 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9] | 18[0 | 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9])\d{8}$` |
| 身份证号 | `^\d{15} | \d{18}$`(15位、18位数字) | |||||||||||||||||||
| 日期格式 | ^\d{4}-\d{1,2}-\d{1,2} |
||||||||||||||||||||
| 空白行的正则表达式 | \n\s*\r (可以用来删除空白行) |
||||||||||||||||||||
| IP地址提取 | \d+\.\d+\.\d+\.\d+ (提取IP地址时有用) |
||||||||||||||||||||
| 腾讯QQ号 | [1-9][0-9]{4,} (腾讯QQ号从10000开始) |
