正则表达式

文章详细介绍了Python中的正则表达式,包括基本语法、字符相关操作(如查找特定字符、数字和字母)、数量和重复次数的使用、分组、边界匹配、re模块函数(如findall、search、match和split)以及正则对象模式。
摘要由CSDN通过智能技术生成

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']

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值