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}可以匹配ababbabbb
{m,} 至少重复m次,最多无上限,比如\w\d{2,}可以匹配a12,_1111,M123等等
表达式至少重复0次,最多重复1次,相当于{0,1}
+ 表达式至少重复1次,相当于{1,}
* 表达式至少重复0次,相当于{0,}

8、位置匹配

符号 含义
^* 匹配以*开头
*$ 匹配以*结尾

9、贪婪与非贪婪匹配

在重复匹配时,正则表达式默认总是尽可能多的匹配,这被称为贪婪模式;
在修饰匹配次数的特殊符号后再加上一个?问号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的”不匹配”。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再多匹配一些,以使整个表达式匹配成功

  1. import re
  2. html_content = '''<p>hello</p>
  3. <p>你好</p>
  4. <p>hi</p>
  5. '''
  6. r = re.match(r"<p>.*?</p>", html_content, re.S)
  7. 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开始)