正则
什么是正则?
正则就是表达式,用于数据的提取。
re模块的简单使用
从左到右进行匹配,apple的每一个字母都可以匹配上
即使后面再写很多的东西
也可以匹配上apple,后面的匹配不上就不管了
从左到右进行匹配,第一个字母都匹配不上,所以就不会再往下进行匹配
import re
pattert = re.compile('apple')#规则
result = pattert.match('apple17189208888')#里面写很多东西,然后规则来匹配
print(result)
##直接写
result = re.match('apple','apple171788')
#第一个参数表示规则,要匹配的东西
#第二个是规则要去匹配的语句
print(result)
第一个写的好处是,一套规则可以多处使用
第二个便洁
正则之代表字符
.表示可以匹配任意字符(除了\n)
可以看到只匹配了一个a,(因为从左到右匹配)
如果想全部打印出来的话
就可以写5个点,可以看到返回了apple
如果直接想看到结果,不想看到这些东西,可以使用group
group表示可以直接取到匹配的值,但是要做判断。
可以看到返回的只有apple
但是如果匹配不到值的话,是会报错的
在apple里面找1,肯定是找不到的,这个时候用ggroup,是会报错的,所以最好先判断一下
import re
result = re.match('1','apple')
if result:#如果有返回值的话,再去打印
print(result)
.匹配不上\n(\n表示换行)
result = re.match('.','\n')
print(result)
显示的结果是
直接返回的none,如果想匹配\n的话
直接写上\n规则就好
匹配小数(\转义)
小数点在正则里面是有意义的,所以想要匹配小数,就得用转义,告诉他,这就是一个小数点
\表示转义,在小数点前面加上\就欧克了
[]表示匹配其中的任意一个字符
[]不管有多少字符,就只能匹配其中的一个
可以看到返回的结果只有一个1
[]中的.只是一个普通的.,没有任何的意义
[a-z]表示匹配从a到z的 任意一个 字符
[a-z0-9]表示匹配 从a到z或者从0到9的 任意一个 字符
[a-z0-9-]表示匹配从a到z 或者从0到9 或者- 的任意一个字符
[a-z]表示匹配 a - z这三个字符当中的任意一个
** 因为\可以转义 ,加上它之后-就没有了意义**
[[]]表示要匹配 [ ] 中的任意一个
在[]里面的^表示取反的意思,它本身代表以什么开头,如下例子
import re
result = re.match('[^5]','5')
#前面的规则是除了5 后面就只有一个5
print(result)
结果
可以看到5是匹配不上的,除了5,任意的一个字符都可以匹配上
re里面的\d(可以匹配一位数字) \D(匹配非数字,一个\D能匹配一个)
因为\d表示匹配一位数字,\d\d这个规则表示要匹配两位数字,但是后面的句子中只有一位数字,所以返回none
\D表示匹配任意一个不是数字的字符,比如
\D匹配的数量也是一个 匹配的是非数字
re里面的\s(匹配一个空格和Tab键) \S(匹配非空白,匹配数量也是一个)
re.match('爱\s情','爱 情')表示匹配爱 情
\S只要不是空格就行
re里面的w和W
w匹配字母、数字、下划线,等价于[a-zA-Z0-9_] \w可以匹配汉字(python),
W匹配特殊字符,比如非字母、非数字、非汉字、非_,它可以支持空格、表情等
原始字符串
r可以消除特殊字符的意义
import re
s = '呵\n呵'
result = re.match(r'呵\n呵',s)
print(result)
结果
\n是换行符,但是前面加上r就没用意义了
再比如
import re
result = re.match(r'.','...')
print(result)
结果
.在正则里面表示匹配除了\n之外的任意一个字符,但是前面加上r之后,.就没有了意义
r的原理
*r就相当于在有意义的字符前面加了反义字符*
正则之代表数量
*代表 0次 或者 无数次
import re
result = re.match('\d*','a')
print(result)
虽然\d是匹配数字的,但是*代表0或者无数,所以运行结果不会返回none
匹配的到是一个’'空字符串
+表示 1次 或者 无数次
?表示 0次 或者 1次
import re
result = re.match('\d?','123456')
print(result)
结果只能匹配到1
?表示0和1次,所以
import re
result = re.match('\d?','a')
print(result)
运行结果也是和*一样的
{n}表示 n次
import re
result = re.match('\d{9}','1234')
print(result)
运行结果
因为最少要出现9个数字,后面的数字不足9个,所以匹配不上
{n,}表示 最少n次
{n,m}表示 n到m次,注意包括n和m
小练习:匹配一个手机号
import re
result=re.match('1[3456]\d{9}','138357510698756')
print(result)
运行结果
只匹配汉字
[\u4E00-\u9FA5\s]+ 多个汉字,包括空格
[\u4E00-\u9FA5]+ 多个汉字,不包括空格
[\u4E00-\u9FA5] 一个汉字
参数i表示忽略大小写
参数g
global,全文搜索,默认搜索到第一个结果接停止