Python基础 21
正则表达式介绍
它是一门独立的语言,跟Python等语言无关,但是其他语言可以使用它完成一些功能,主要用来选数据
^(13|14|15)[0-9]{9}$ 正则表达式
正则表达式:
利用一些特殊符号匹配出想要的数据就是正则表达式
字符组
[0123456789] 匹配0-9之间的数字
[0-9] 匹配0-9之间的数据
\d 匹配0-9之间的数据
[a-z] 匹配a-z之间的字符
[A-Z] 匹配A-Z之间字符
匹配0-9a-zA-Z如何写
[0123456789ABCDEFGHIJ...abcdefghij...]
[0-9A-Za-z]
字符
. 匹配除换行符以外的任意字符 # 掌握
\w 匹配字母或数字或下划线 # 掌握
\s 匹配任意的空白符
\d 匹配数字 # 掌握
\n 匹配一个换行符 # 掌握
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始 # 掌握
$ 匹配字符串的结尾 # 掌握
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b # 掌握
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符 # 掌握
[^...] 匹配除了字符组中字符的所有字符 # 掌握
1. 量词只能影响前面的一个字符
2. 量词不能单独使用,必须配合其他字符串使用
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
贪婪匹配和非贪婪匹配
待匹配的字符
<script>123</script>
正则表达式是:
<.*>
匹配结果是:
<script>123</script>
默认匹配的是贪婪匹配:尽可能的多匹配
把贪婪匹配转为非贪婪匹配
<.*?> 非贪婪匹配尽可能的少匹配
.*?组合的用法
小练习
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
由于正则表达式的复杂性,所以,以后遇到常见的匹配规则,我们就去百度搜
1. 写一个匹配常见的手机号的正则
^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$
re模块
1. re是内置的模块,可以直接使用
2. 在python中,要想使用正则需要借助于re模块
re: regular express
import re # re.findall('这是正则表达式', '待匹配的文件') # res=re.findall('b', 'eva jason kavin') # print(res) # ['a', 'a', 'a'] # 如果匹配不到字符,就返回空列表[] # res=re.search('b', 'eva jason kavin') # print(res) # print(res.group()) """如果匹配不到,就返回None""" # if res: # print(res.group()) # else: # print('没有匹配到') # try: # print(res.group()) # except Exception: # print('没有找到') res=re.match('a', 'aeva jason kavin') # 从开头开始匹配 print(res) print(res.group())
分组
# 分组相关 # res = re.search('^[1-9](\d{14})(\d{2}[0-9x]?)$','110105199812067023') # print(res) # print(res.group()) # print(res.group(1)) # print(res.group(2)) # 无名分组 # 对于findall,它具有分组优先展示, 也称之为是无名分组 # res = re.findall('^[1-9]\d{14}(?:\d{2}[0-9x]?)$','110105199812067023') # print(res) # ['023'] # 有名分组 res = re.search('^[1-9]\d{14}(?P<month>\d{2}[0-9x]?)$','110105199812067023') print(res) # print(res.group(1)) print(res.group()) print(res.group(1)) print(res.group('month'))
正则实战案例
import re with open('hongniu','r',encoding='utf8')as f : res=f.read() cdm=re.findall('<h2>(.*?)</h2>',res) cdm1=re.findall("<p class='mapIco'>(.*?)</p>",res) cdm2=re.findall("<p class='mailIco'>(.*?)</p>",res) cdm3=re.findall("<p class='telIco'>(.*?)</p>",res) cmd=zip(cdm,cdm1,cdm2,cdm3) # print(list(cmd)) for item in list(cmd): print(''' 公司名称:%s 公司地址:%s 公司邮箱:%s 公司电话:%s '''%(item[0],item[1],item[2],item[3]))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY