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 re
html_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开始) |