正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配
re模块使python语言拥有全部的正则表达式功能
compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
re.match(pattern, string, flags = 0) #pattern:匹配的正则表达式 #String:要匹配的字符串 #flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
匹配成功re.match方法返回一个匹配的对象,否则返回None
我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式
group(num=0):匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组
即match的用法是匹配以什么开头的字符串
import re
set = re.match('速度与激情','速度与激情8')
a = set.group()
print(a)#结果:速度与激情
字符:. 功能: 匹配任意一个字符串(\n除外)
[] 匹配[]列举的字符串
\d 匹配一位数的数字:0-9
\D 匹配非数字
\s 匹配空白,如空格,tab键
\S 匹配非空白
\w 匹配单词字符,各种语言文字
\W 匹配非单词字符
import re ret1 = re.match(r'速度与激情\d','速度与激情88') a1 = ret1.group() print(a1) #速度与激情8 #'r'是防止字符转义的,如果路径中出现'\t'的话,不加r的话\t就能保留原有的样子 #在字符串赋值的时候,前面加'r'可以防止字符串在转义的时候不被转义 #在python的string前面加上'r',是为了告诉编译器这个String是个raw string,不要转义,例如\n在raw String中,是两个字符\和n, #而不会转义为换行符,由于正则表达式和\会有冲突,因此,当一个字符串使用了正则表达式后,最好在前面加上'r' ret2 = re.match(r'速度与激情[12345678]','速度与激情88') #后面加*是88 a2 = ret2.group() print(a2) #速度与激情8 ret3 = re.match(r'速度与激情[1-8]','速度与激情88') a3 = ret3.group() print(a3) #速度与激情8 ret4 = re.match(r'速度与激情[1-36-8]','速度与激情88') a4 = ret4.group() print(a4) #速度与激情8 ret5 = re.match(r'速度与激情.','速度与激情88') a5 = ret5.group() print(a5) #速度与激情8 ret6 = re.match(r'速度与激情.','速度与激情aa') a6 = ret6.group() print(a6) #速度与激情a ret7 = re.match(r'速度与激情.','速度与激情-') a7 = ret7.group() print(a7) #速度与激情-
匹配多个字符串:
字符:* 功能:匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少出现1次
? 匹配前一个字符出现0次或者出现1次,即最多出现1次
{m} 匹配前一个字符要出现m次
{m.n} 匹配前一个字符出现的次数可以在m到n之间
import re
rat1 = re.match(r'速度与激情\d*','速度与激情')
a1 = ret1.group()
print(a1)
#速度与激情
rat2 = re.match(r'速度与激情\d*','速度与激情1')
a2 = rat2.group()
print(a2)
#速度与激情1
rat3 = re.match(r'速度与激情\d*','速度与激情1111122')
a3 = rat3.group()
print(a3)
#速度与激情1111122
#rat4 = re.match(r'速度与激情\d+','速度与激情')
#a4 = rat4.group()
#print(a4)
#报错
rat5 = re.match(r'速度与激情\d+','速度与激情1')
a5 = rat5.group()
print(a5)
#速度与激情1
rat6 = re.match(r'速度与激情\d+','速度与激情11122') #即匹配前一个类型的东西,至少是一个
a6 = rat6.group()
print(a6)
#速度与激情11122
rat7 = re.match(r'速度与激情\d?','速度与激情')#最多是一次,多了不匹配就好了
a7 = rat7.group()
print(a7)
#速度与激情
rat8 = re.match(r'速度与激情\d?','速度与激情1')
a8 = rat8.group()
print(a8)
#速度与激情1
rat9 = re.match(r'速度与激情\d?','速度与激情11')
a9 = rat9.group()
print(a9)
#速度与激情1
rat10 = re.match(r'速度与激情\d{1}','速度与激情1')
a10 = rat9.group()
print(a10)
#速度与激情1
rat13 = re.match(r'速度与激情\d{1}','速度与激情11')
a13 = rat11.group()
print(a13)
#速度与激情1
#rat11 = re.match(r'速度与激情\d{4}','速度与激情11')#可以少但是不能多
#a11 = rat11.group()
#print(a11)
#报错
rat12 = re.match(r'速度与激情\d{2,3}','速度与激情111')
a12 = rat12.group()
print(a12)
#速度与激情111
其他符号:符号: ^ 功能:从字符串的开头开始匹配,match函数默认从头开始匹配
$ 字符串必须以前一个字符结尾
| 匹配左右任意一个表达式
(ab) 将括号中的字符作为一个分组
\num 引用分组num匹配到的字符
(?p<name>) 分组起别名
(?p =name) 引用别名为name的分组匹配到的字符
import re
#必须以数字为结尾
re.match(r'速度与激情\d$','速度与激情a').group()
#报错
re.match(r'速度与激情\d$','速度与激情1').group()
#速度与激情1
#re.match(r'速度与激情\d$','速度与激情11')
#报错
#分别取出字符串'速度与激情22aa'中的数字和小写字母
re.match(r'速度与激情(\d*)([a-z]*)','速度与激情22aa').group(1)
re.match(r'速度与激情(\d*)([a-z]*))','速度与激情22aa').group(2)
re.match(r'速度与激情(?P<num>\d*)(?P<str>[a-z]*)','速度与激情22aa').group(1)
re.match(r'速度与激情(?P<num>\d*)(?P<str>[a-z]*)','速度与激情22aa').group(2)#注意:外面在不需要写括号
re.match(r'速度与激情(?P<num>\d*)(?P<str>[a-z]*)','速度与激情22aa').group()#'速度与激情22aa'
#判断字符串是否对称
re.match(r'(\w){1}a{1}\1','1a1').group() #1a1
re.match(r'(?P<num>\w){1}a{1}(?P=num)','1a1').group()#1a1
#正则表达式中的三组括号把匹配结果分成三组
#group()同group(0)就是匹配正则表达式整体结果
#group(1)列出第一个括号匹配部分,group(2)列出第二个括号匹配部分,group(3)列出第三个括号匹配内容
#group(num=0)匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下,它将返回一个包含那些组所所对应值的元组
#groups()返回一个包含所有小组字符串的元组,从1到所含的组号
正则化表达式的其他高级用法
search从左往右搜索第一个符合条件的字符至不再符合条件的字符
import re #取出字符串中的数字 re.search(r'\d+','阅读量:1110,点赞数:12332').group() #1110 #可见search只能找出从左往右第一个符合条件的字符,直到条件符合结束
findall查找所有符合条件的字符
#取出字符串中的所有数字,不用写group re.findall(r'\d+','阅读量:1110,点赞数:12332') #['1110', '12332'],说明findall能够查询所有符合条件的字符
sub替换匹配的字符
import re
#代码1
re.sub(r'\d+','10000','阅读量:1110')
#'阅读量:10000'
#代码2
re.sub(r'\d+','10000','阅读量:1110,点赞数:12332')
#'阅读量:10000,点赞数:10000'
#代码3
def add(temp):
num = int(temp.group())+1
str1 = str(num)
return str1
re.sub(r'\d+',add,'阅读量:1110')
#'阅读量:1111'
split根据匹配进行切割字符串,并返回一个列表,此处应该是按照冒号拆分
import re re.split(r':| ','阅读量:1110 点赞数:11111')#注意:|后面要加空格,如果不加空格那么就变成个逐字拆分 #['阅读量', '1110', '点赞数', '11111']
几个案例
检查用户输入的是否为手机号码,手机号码为11位数字
import re
a = input('请输入手机号码:')
ret = re.match('\d{11}$',a) #$表示结束
if ret:
print('输入的手机号码%s符合规范'%a)
else:
print('输入的手机号码%s不符合规范'%a)
检查一个字符是否符合作为变量名的标准,变量名只能由下划线(__)、字母、数字组成,第一个字符不能是数字
import re
names = ['asd','_asd','3_d','d_3','a!a','aa#']
for name in names:
ret = re.match('[a-zA-Z_][a-zA-Z0-9_]*$',name)#表示的是以大小写或下划线开头,只接受大小写字母、数字和下划线
if ret:
print('字符串%s可以作为变量名'%name)
else:
print('字符串%s不可以作为变量名'%name)
检查用户输入的是否为163邮箱,给定的条件是@前面只能由数字或者字母组成,且字符量在5-20之间
import re
a = input('请输入一个邮箱:')
ret = re.match('[a-zA-Z0-9]{5,20}@163.com$',a) #$表示结束
if ret:
print('输入的邮箱%s是一个规范的163邮箱'%a)
else:
print('输入的邮箱%s不是一个规范的163邮箱'%a)