Python正则表达式

什么是正则表达式

正则表达式就是一种规则,为了找到符合某种模式的字符串,这些模式包括:是什么字符、重复多少次、在什么位置、有哪些额外的约束

正则表达式的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)

你可能感兴趣的:(正则表达式,python)