什么是正则表达式
正则表达式就是一种规则,为了找到符合某种模式的字符串,这些模式包括:是什么字符、重复多少次、在什么位置、有哪些额外的约束
正则表达式的7个境界
1、固定的字符串
import re
text = '丘丘身高:166,体重:120,学号:123456,密码:678,123456'
#确定字符串中是否有123456
print(re.findall(r'123456',text))
运行结果:
['123456', '123456']
2、某一类字符
import re
text = '丘丘身高:166,体重:120,学号:123456,密码:678,123456'
#找出所有单个的数字
print(re.findall(r'\d',text))
运行结果:
['1', '6', '6', '1', '2', '0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '1', '2', '3', '4', '5', '6']
3、重复某一类字符
import re
text = '丘丘身高:166,体重:120,学号:123456,密码:678,123456'
#找出所有的数字
print(re.findall(r'\d+',text))
运行结果:
['166', '120', '123456', '678', '123456']
4、组合
import re
text = "电话1:13677898088,电话2:35289400972,爱好数字:999888,座机号1:0268-9865096,座机号2:028-94679320"
#找出座机号码
print(re.findall(r"\d{3,4}-\d{7,8}",text))
运行结果:
['0268-9865096', '028-94679320']
5、多种情况
import re
text = "电话1:13677898088,电话2:35289400972,爱好数字:999888,座机号1:0268-9865096,座机号2:028-94679320"
#找出手机号或者座机号
print(re.findall(r"1\d{10}|\d{3,4}-\d{7,8}",text))
运行结果:
['13677898088', '0268-9865096', '028-94679320']
6、限定位置
import re
text = "18322222222,电话1:13677898088,电话2:35289400972,爱好数字:999888,0268-9865096,座机号2:028-94679320,18786568853"
#找出在句子开头的手机号或者座机号
print(re.findall(r"^1\d{10}|^\d{3,4}-\d{7,8}",text))
运行结果:
['18322222222']
7、内部约束
import re
text = "niuniuniu,hahhah,kkk,heitui~"
#找出像 qweqwe yuiyui这样的前后3个字母重复的字符串
print(re.findall(r"(\w{3})(\1)", text))
运行结果:
[('niu', 'niu'), ('hah', 'hah')]
写正则表达式的套路
以包含分机号的座机电话号码为例,比如 0280-1537879-8643
步骤:
①确定该模式包含几个子模式
包含3个子模式:0280、1537879、8643,每个子模式用 - 连接
②各部分的字符类型是什么?
子模式都是数字,用 - 连接,所以可以写为
\d-\d-\d
③各个子模式如何重复
座机号的第1个子模式重复3-4次、第2个子模式重复7-8次、第3个子模式重复3-4次,加上次数限制之后,可以写为:
\d{3,4}-\d{7,8}-\d{3,4}
但是有的座机没有分机号,所以可以写为
\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}
④是否有位置限制
没有
⑤是否有内部制约关系
没有
所以最终代码是:
import re
text = "随机数字:0179497920,座机号1:123-12345678-1234,座机号2:1234-1234567-123"
print(re.findall(r"\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}",text))
显示结果:
['123-12345678-1234', '1234-1234567-123']
语法规则
1、字符类别
正则 | 匹配 |
a b c 1 2 3 - | 字符常量,写什么就是什么 |
\d | 一个数字 |
\D | 一个不是数字的字符 |
\s | 一个空格 |
\S | 一个不是空格的字符 |
\w | 一个字母或者汉字或者数字或者下划线 |
\W | 一个不是字母不是汉字不是数字不是下划线的字符,比如标点、空格 |
[niu] | n或者i或者u |
[a-d] | 范围:从a到d的任意一个字符 |
[^a-d] | 取反:除了a到d的任意一个字符 |
[\b] | 退格符号(Backspace) |
. | 通配符:除了换行\n之外的任意一个字符 |
2、重复次数,也叫做量词
正则 | 匹配 |
* | 0个或者多个 |
+ | 1个或者多个 |
? | 0个或者1个 |
{2} | 2个 |
{2,5} | 2到5个 |
{2,} | 至少2个 |
{,5} | 最多5个 |
3、组合
正则 | 匹配 |
\d{6}[a-z]{3} | 6个数字后面跟着3个小写字母 |
| | 或者 |
() | ()表示分组,分组后可以以组为单位,再限制重复次数,比如:(abc){3} 表示abcabcabc |
4、位置
正则 | 匹配 |
^ | 开头 |
$ | 结尾 |
\b | 边界 |
\B | 非边界 |
(?=...) | 出现在...之后 |
(?!...) | 不出现在...之后 |
(?<=...) | 出现在...之前 |
(? | 不出现在...之前 |
(?()|) | 条件语句 |
5、标记
正则 | 匹配 |
i | 忽略大小写 |
m | 匹配的时候,可以跨行 |
6、特殊字符
正则 | 匹配 |
\n | 换行符 |
\r | 回车符 |
\t | tab符号 |
Python正则模块re的用法
1、查找
方法 | 匹配 |
re.search() | 只返回一个(返回Match迭代器) |
re.match() | 匹配开头,只返回一个(返回Match迭代器) |
findall() | 返回字符串 |
finditer | 返回Match迭代器 |
2、替换
方法 | 作用 |
re.sub() | 替换 |
re.subn() | 替换,并且替换完之后要返回替换了多少个字符串 |
3、分割
re.split()
代码:
import re
text = "张三 ; 李四4 ! 王五;5; 赵六"
result = re.split(r"\s*[;!]\s*",text)
print(result)
运行结果
import re
text = "张三 ; 李四4 ! 王五;5; 赵六"
result = re.split(r"\s*[;!]\s*",text)
print(result)