十、正则表达式详解:掌握强大的文本处理工具(二)

本文详细介绍了正则表达式的多字符匹配规则,如星号、加号等;匹配规则的代替,像\\d可用[0 - 9]代替;还有特殊匹配及特殊匹配plus。还提到search()遍历方式、以特定字符结尾提取数据等,最后预告下节介绍贪婪与非贪婪模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🍀多字符匹配

  1. 星号(*):匹配0个或者多个字符
import re

text = '111-222-333'
result = re.match('[\d]', text) # 没有*,匹配第一个
result1 = re.match('[\d]*', text)  # 有*,从起始位置开始,匹配0或者多次
result2 = re.match('[-\d]*', text)   # 有*,从起始位置开始,匹配0或者多次
result3 = re.match('[-]*', text)  # 有*,从起始位置开始,匹配0或者多次
print(result.group(),len(result.group()))
print(result1.group(),len(result1.group()))
print(result2.group(),len(result2.group()))
print(result3.group(),len(result3.group()))

运行结果如下
在这里插入图片描述

注意:匹配不出来,只不过是空,并不会报错


  1. 加号(+):匹配一个或者多个
text = 'Q111-222-333'
result = re.match('[Q\d]+', text)
result1 = re.match('[\d]+', text)
print(result.group(),len(result.group()))
print(result1.group(),len(result1.group()))

运行结果如下

在这里插入图片描述

注意:有+,对[]里的内容匹配一次或者多次(至少一次)、从起始位置开始

  1. 问号(?):匹配0个或者1个
text = 'Q111-222-333'
result = re.match('[Q\d]?', text)
result1 = re.match('[\d]?', text)
print(result.group(),len(result.group()))
print(result1.group(),len(result1.group()))

运行结果如下

在这里插入图片描述

注意:从起始位置开始,和*有一点相近

  1. {m}:匹配指定个数m
text = 'Q111-222-333'
result = re.match('[Q\d]{2}', text)
result1 = re.match('[Q\d]{5}', text)
print(result.group(),len(result.group()))
print(result1.group(1),len(result1.group()))

运行结果如下

在这里插入图片描述

注意:从起始位置

  1. {m,n}:匹配m到n个,默认匹配最多次
text = '111-222-333'
text1 = '111-2^22-333'
result = re.match('[-\d]{2,8}', text)
result1 = re.match('[-\d]{2,8}', text1)
print(result.group())
print(result1.group())

运行结果如下
在这里插入图片描述

注意:若内容存在不属于规则的内容,则停止,直接输出

🍀匹配规则的代替

  1. \d------[0-9]:匹配所有的数字
text = '111-222-333'
result = re.match('[-0-9]*', text)
print(result.group())

运行结果如下

在这里插入图片描述
注意:这里经常与(*)进行搭配,进而匹配多次数字

  1. \D----[^0-9]:匹配所有的非数字
text = '111-222-333'
result = re.match('[^0-9]+', text)
print(result.group())

运行结果如下

在这里插入图片描述

注意:这里经常配合+(1次或多次),匹配1次或多次非数字字符;其实也可以配合*(0次或多次),匹配0次或多次非数字字符

  1. \w-----[0-9a-zA-Z_]:匹配所有数字、字母、下划线
text = '111-222-333'
result = re.match('[0-9a-zA-Z_]+', text)
print(result.group())

运行结果如下
在这里插入图片描述
注意:减号不在匹配范围之内

  1. \W-----[^0-9a-zA-Z]:匹配所有非数字、字母和下划线
text = '111-222-333'
result = re.match('[^0-9a-zA-Z_]+', text)
print(result.group())

运行结果如下
在这里插入图片描述
注意:这里和之前那个有相似之处,主要是因为+,这里的+是匹配至少一次,然而一开始检索就没找到,自然报错了

  1. [\d\D]、[\w\W]:匹配所有的字符
text = '111-222-333'
result = re.match('[\w\W]+', text)
print(result.group())

运行结果如下
在这里插入图片描述

所以说还是这个牛吧


🍀特殊的匹配

例子如下:

text = '111-222-333'
text1 = '....111-222-333'
result = re.match('[.]+', text)
result1 = re.match('.+', text)
result2= re.match('[.]+', text1)
print(result1.group())
print('*')
print(result2.group())
print('*')
print(result.group())

运行结果如下
在这里插入图片描述
注意:去掉中括号后,点表示所有字符再配上+匹配所有字符,但是中括号加上点后代表的就是匹配点了,然而text1并没有,所有遵循+的规则至少一个,所以报错

感兴趣的小伙伴可以自己试着来,将手机号、邮箱、身份证号码的规则自己写出来


🍀特殊的匹配plus

  1. 全局遍历
text = 'Hello HeWord'
result = re.search('He', text)
print(result.group())

运行结果如下
在这里插入图片描述
注意:search()是从左到右进行字符串遍历,找到就返回,若后续再出现,也不再返回结果

  1. $:以某某为结尾
text = 'HelloHeWord@163.com'
result = re.search('[\w]+@[a-z0-9]+[.]com$', text)
print(result.group())

运行结果如下

在这里插入图片描述
注意:以com为结尾提取数据,若不是以该词结尾就会报错

  1. |:匹配多个表达式或者字符串
text = 'https://www.baidu.com'
result = re.search('[https|http]',text)
print(result.group())

运行结果如下
在这里插入图片描述

text = 'https://www.baidu.com'
result = re.search('[https|http]+',text)
print(result.group())

运行结果如下
在这里插入图片描述

text = 'https://www.baidu.com'
result = re.search('(https|http)',text)
print(result.group())

运行结果如下
在这里插入图片描述
综上所述:中括号是将里面看成一个字符串,小括号则以|为标准分层若干字符串

🍀总结

本节介绍了多字符匹配,其中包括星号、加号等;匹配规则的代替,例如\d可以使用[0-9]代替使用;以及特殊的匹配。下节介绍贪婪模式与非贪婪模式,曾有大佬说明,不了解贪婪模式和非贪婪模式,就无法进行爬虫

如果没看过正则表达式详解:掌握强大的文本处理工具(二)的小伙伴,可以看看,感谢支持!!!

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馒头学python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值