python之正则表达式
python之正则表达式
正则通,通则达。
昨日简述
文件类型
两种:执行文件与被执行文件。
分别:用__ name __ 分别。
启动脚本:if __ name __ = '__ main __'
循环导入
概念:两个文件相互导入。
缺陷:可能会报错或重复运行。
避免方式:做到名全部定义好后才出现调用,或者不让循环导入情况出现。
模块的查找顺序
内存——>内置——>sys.path
绝对导入与相对导入
绝对导入:以项目根目录为基准导入模块,可将目标地址添加到sys.path。
相对导入:只能在模块文件中使用,限制较多,但是较为省代码。
包
概念:内部含有多个模块文件,并拥有__ init __.py的文件夹。
作用:更好的去管理相性较高的模块文件。
使用:调用包的名,类似调用__ init __.py,或者直接导入包内部的名。
编程思想的演变
-
堆代码式编写
熟悉代码的过程
-
函数功能编写
熟练函数的过程
-
模块调用式编写
逐步完善的写法
软件开发目录规范
要求:项目工作中,软件文件名最好为英文。
ATM项目根目录
bin文件夹
启动文件的存放目录
start.py
conf文件夹
配置文件的存放目录
settings.py
core文件夹
项目整个运行逻辑的文件存放目录
src.py
lib文件夹
共同的功能存放目录
common.py
log文件夹
日志存放目录
log.txt
db文件夹
核心数据存放目录
userinfo.txt
readme文件
类似于项目说明书
requirements.txt文件
今日学习内容
正则表达式的作用
生活中常见例子:获取手机号
如果使用python实现,需要成为if战神。
但是如果使用正则表达式
import re
phone_number = input('请输入您的手机号:').strip()
if re.match('^(13|14|15|18|19)[0-9]{9}$', phone_number):
执行子代码
else:
print('请输入正确的手机号')
代码量十分精简明了。
正则表达式是一门独立的语言,主要依靠特殊符号去判断筛选数据,在任意的编程语言中都使用,只不过在python中使用的话需要调用re模块。
正则表达式字符
使用中括号[ ]内部填什么数据就会筛选出什么数据。
[0-9] 筛选出0到9的数据
[a-z] 筛选出a到z的数据
[A-Z] 筛选出A到Z的数据
[0-9a-zA-Z] 筛选任意一个数字或者大小写字母
正则表达式特殊符号
. 筛选出除了换行符以外任意字符
\w 筛选出数字、字母、下划线
\d 筛选出任意数字
\t 筛选出一个制表符(tap键)
^ 筛选字符串的开始
$ 筛选字符串的结尾
\W 筛选出非字母数字和下划线
\D 筛选出非数字
a|b 匹配a或者b,管道符就是or的意思
() 给正则表达式分组
[] 字符组的概念,里面数据都是或的关系
[^] 上键号出现在中括号的意思是取反操作
正则表达式量词
量词必须跟在表达式后面,目的是获得更多满足筛选条件的数据
量词默认都是贪婪匹配,尽可能取出多个满足筛选的数据。
星号* 重复0次或者多次
加号+ 重复0次或者多次
问号? 重复0次或者一次
{n} 重复n次
{n,} 重复最少n次,或者多次
{n,m} 重复n到m次,最多m次
复杂正则的编写
校验用户身份证号
“身份证号码是18位数。这18位数实际上是由17位数字码加1位校验码组成的。(1)前1、2位数字表示所在省份的代码。(2)第3、4位数字表示所在城市的代码。(3)第5、6位数字表示所在区县的代码。(4)第7、8、9、10位是出生的年份。”
身份证:[1]{17}[0-9x]
邮箱:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}
中文:[\u4e00-\u9fa5]
用户名:[A-Za-z0-9_-\u4e00-\u9fa5]+
能理解了嘛?
取消转义
\n 取消转义,需要在前面再加一个\
在python中可以直接使用最前面加r取消转义
贪婪匹配和非贪婪匹配
量词默认都是贪婪匹配,即尽可能的获取多个数据
如需修改成非贪婪匹配,在量词后面加上?即可。
<.*> <script>alert(123)<script> 1条 贪婪匹配
以最后一个大括号的出现作为结束标志
<.*?> <script>alert(123)<script> 2条 非贪婪匹配
以第一个大括号的出现作为结束标志
re模块
在python中无法直接使用正则表达式,需要先调用re模块。
作业
import re # 调用一个正则表达式模块
import requests # 调用一个获取页面原代码的模块
res = requests.get(url="http://www.redbull.com.cn/about/branch") # 获取红牛页面的源代码
with open('1.txt','wb') as f1: # 用二进制重写一个文件夹,没有就创建,将其赋值给f1
for i in res: # 循环将res红牛页面源代码赋值给i
f1.write(i) # 将i写入f1
# 取一段需要获取信息的源代码,列出来。
# data-describe='杭州市上城区庆春路29号远洋大厦11楼A座'> # 正则表达式 data-describe=\'(.*?)\'>
# <h2>红牛杭州分公司</h2> # 正则表达式 <h2>(.*?)</h2>
# <p class='mapIco'>杭州市上城区庆春路29号远洋大厦11楼A座</p> # 正则表达式 <p class=\'mapIco\'>(.*?)</p>
# <p class='mailIco'>310009</p> # 正则表达式 <p class=\'mailIco\'>(.*?)</p>
# <p class='telIco'>0571-87045279/7792</p> # 正则表达式 <p class=\'telIco\'>(.*?)</p>
# 用一个变量名接收,小括号是为了让他每一段源代码获取到底数据转化成一个元组,\''是为了取消''在python中的特殊含义
com = re.compile('data-describe=\'(.*?)\'><h2>(.*?)</h2><p class=\'mapIco\'>(.*?)</p><p class=\'mailIco\'>(.*?)</p><p class=\'telIco\'>(.*?)</p>')
with(open('1.txt','r',encoding='utf8')) as f2: # 直接文本模式读取1.txt文件,赋值给f2
res2 = f2.read() # 读取全部 赋值给f1
res1 = re.findall(com,res2) # 使用re正则表达式模块的模板功能,参数1放事先写好的com,参数2放目标文件
for i in res1: # res1内部是一个列表套元组,循环取出每个元组,然后利用索引取值,
print(
f"""
公司名称:{i[1]}
地址:{i[2]}
邮编:{i[3]}
电话:{i[4]}
"""
)
感谢看完!
今日小结
学到了新鲜的知识!!!!!
\d ↩︎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!