1.正则表达式的语法
1.字符相关语法
1.字符串本身
import re
text='黄继翔与郑心怡天天开心,黄继翔的qq邮箱是3208690479@qq.com。杭州最近下小雨'
res1=re.findall('黄继翔',text)
print(res1)
运行结果 ['黄继翔', '黄继翔']
2.包含字符 [] 判断包含某一个
res2=re.findall(r'黄继翔[与的]',text)
print(res2)
运行结果 ['黄继翔与', '黄继翔的']
3.含有数字特殊字符 [0-9]
import
text='huangjixiang无敌且66666,为什么呢A555,我也不知道B8888'
res=re.findall(r'且[0-9]',text)
print(res)
运行结果 ['且6'] #只会找到与他相邻的第一个数字
4.含有字母特殊字符
res1=re.findall(r'huang[a-z]',text)
print(res1)
运行结果 ['huangj'] #只会找到与他相邻的第一个字母
res1=re.findall(r'呢[A-Z]',text)
print(res1)
运行结果 ['呢A'] #只会找到与他相邻的第一个字母
5.\d 表示数字 0-9任意一个
text='huangjixiang无敌且66666,为什么呢A555,我也不知道B8888'
res=re.findall(r'且\d',text)
print(res)
运行结果 ['且6']
text='huangjixiang无敌且66666,为什么呢A555,我也不知道B8888'
res=re.findall(r'且\d\d\d\d\d',text)
print(res)
运行结果 ['且66666']
注意有几个\d就取几个数字,若超出了文本的数字数量则结果是空列表
6.{n} n表示紧跟着大括号的符号出现了n次
text='huangjixiang无敌且66666,为什么呢A555,我也不知道B8888'
res=re.findall(r'且\d{3}',text)
print(res)
运行结果 ['且666']
text = '博主讲的实在是太好了,通俗易懂,已三连,求课件,我的邮箱是 1165872335@qq.com 或者是xiaohu2023666@pronton.com谢谢博主 \
手机微信号也可以17354074069'
res=re.findall(r'\d{11}',text)
print(res)
运行结果 ['17354074069']
7.{n, } 表示匹配n个及n个以上
text = '博主讲的15354074069实在是太好了,通俗易懂,18354074069 已三连,求课件,我139xxx的邮箱是 1165872335@qq.com ' \
'或者是xiaohu2023666@pronton.com谢谢博主 手机微信号也可以17354074069987654321'
res1 = re.findall(r'1[857]3\d{9,}', text)
print(res1)
运行结果 ['17354074069987654321']
8.{n, m} n表示最小匹配次数 m表示最大匹配次
text = '博主讲的15354074069实在是太好了,通俗易懂,183543074069 已三连,求课件,我139xxx的邮箱是 1165872335@qq.com ' \
'或者是xiaohu2023666@pronton.com谢谢博主 手机微信号也可以17354074069987654321'
res1 = re.findall(r'1[857]3\d{8,12}', text)
print(res1)
运行结果 ['15354074069', '183543074069', '173540740699876']
9.\w 大小写字母 数字 下划线 汉字
text='hjshjdf回家睡觉的话就是,很简单ndjksjd78786736,hdhduduyi'
res=re.findall(r'很简单\w',text)
print(res)
运行结果 ['很简单n'] 后面一般取一位
10.表示数量次数
1.?表示出现了0次或者1次
text='hjshjdf回家睡觉的话就是,很简单ndjksjd78786736,hdhduduyi很简单'
res=re.findall(r'很简单\w?',text)
print(res)
运行结果 ['很简单n', '很简单']
2.+
表示出现了1次或者n次
text='hjshjdf回家睡觉的话就是,很简单ndjksjd78786736,hdhduduyi很简单h'
res=re.findall(r'很简单\w+',text)
print(res)
运行结果 ['很简单ndjksjd78786736', '很简单h']
3.*表示出现了0次或者n次
text='hjshjdf回家睡觉的话就是,很简单ndjksjd78786736,hdhduduyi很简单'
res=re.findall(r'很简单\w*',text)
print(res)
运气结果 ['很简单ndjksjd78786736', '很简单']
注意这里的数量次数一般与其他用法在一起使用
11.\W 除了大小写字母 数字 下划线 汉字,匹配其他字符
text='hhdhhh ghhgh,hgdhgsdh$ghjsdgs'
res=re.findall(r'hh\W',text)
print(res)
运行结果 ['hh ']
12. .
表示任意字符
text='hhdhh ghhgh,hgdhgsdh$ghjsdgs'
res=re.findall(r'hh.',text)
print(res)
运行结果 ['hhd', 'hh ', 'hhg']
2.正则表达式使用的注意事项
1.在使用数量相关语法的正则情况下,默认python使用的是贪婪匹配
text='hjx876767.jhsdhjhfhjx6'
res=re.findall(r'hjx\w+',text)
print(res)
运行结果 ['hjx876767', 'hjx6']
一般贪婪匹配都与数量有关,且优先全部匹配完
3.正则进阶使用
1.()分组
text=text = '我的身份证号是:32012320001231987X,还有一个人的身份证是320123200110059879,手机号是17332012325' # ['2000','2001']
res=re.findall(r'320123(\d{4})\w{7}[\dX]',text)
print(res)
运行结果 ['2000', '2001']
想取出正则表达式需要的那部分
text=text = '我的身份证号是:32012320001231987X,还有一个人的身份证是320123200110059879,手机号是17332012325' # ['2000','2001']
res=re.findall(r'(320123(\d{4})\w{7}[\dX])',text)
print(res)
运行结果 [('32012320001231987X', '2000'), ('320123200110059879', '2001')]
取出2部分,以元组的形式返回给列表。以后想同时取出不同的数据,就得常用()
2.^ 以xx开头
text='hjx020915jhvhgvc jh'
res=re.findall(r'^h\w+',text)
print(res)
运行结果 ['hjx020915jhvhgvc']
只能用在字符串的开头,在其他位置用会返回空列表
3.$以xxx结尾
text='hjx020915jhvhgvc jz'
res=re.findall(r'z$',text)
print(res)
运行结果 ['z']
只能用在字符串的结尾,在其他位置用会返回空列表
4.re模块的函数
1.findall() 在大字符串中查找所有符合正则表达式规则的小串,返回一个符合结果的列表(上面举的例子都是)
2.search() 从左向右匹配,智慧匹配一次(str)
text='hjx020915jhvhgvcjz'
res=re.search(r'\w+',text)
print(res)
运行结果 <re.Match object; span=(0, 18), match='hjx020915jhvhgvcjz'> #返回的是一个对象跟索引值
text='hjx020915jhvhgvcjz'
res=re.search(r'\w+',text)
print(res.group())
运行结果 hjx020915jhvhgvcjz #用自带函数group()返回你想要取的字符串
3.match() 从左向右,从第一个字符就开始匹配,如果第一个字符不符合,停止匹配,返回None (str)
text='hjx020915jhvhgvcjz'
res=re.match(r'[a-z]\w',text)
print(res.group())
运行结果 hj
text='hjx020915jhvhgvcjz'
res=re.match(r'[0-9]\w',text)
print(res)
运行结果 None
4split()
text = 'hjxhjdascuhkkjhahjxjyedqghyw'
res=re.split(r'j',text)
print(res)
运行结果 ['h', 'xh', 'dascuhkk', 'hah', 'x', 'yedqghyw']
5.其他函数
#re.fullmatch() # 匹配整个字符串是否符合正则表达式
re.finditer() # 返回的是一个可以迭代的对象
5.re对象模式
text = 'hjxhjdascuhkkjhahjxjyedqghyw'
res_obj=re.compile(r'[d|y]\w')
print(res_obj.findall(text))
运行结果 ['da', 'ye', 'dq', 'yw']