python之正则表达式

python之正则表达式

正则通,通则达。

昨日简述

文件类型

两种:执行文件与被执行文件。

分别:用__ name __ 分别。

启动脚本:if __ name __ = '__ main __'

循环导入

概念:两个文件相互导入。

缺陷:可能会报错或重复运行。

避免方式:做到名全部定义好后才出现调用,或者不让循环导入情况出现。

模块的查找顺序

内存——>内置——>sys.path

绝对导入与相对导入

绝对导入:以项目根目录为基准导入模块,可将目标地址添加到sys.path。

相对导入:只能在模块文件中使用,限制较多,但是较为省代码。

概念:内部含有多个模块文件,并拥有__ init __.py的文件夹。

作用:更好的去管理相性较高的模块文件。

使用:调用包的名,类似调用__ init __.py,或者直接导入包内部的名。

编程思想的演变

  1. 堆代码式编写

    熟悉代码的过程

  2. 函数功能编写

    熟练函数的过程

  3. 模块调用式编写

    逐步完善的写法

软件开发目录规范

要求:项目工作中,软件文件名最好为英文。

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):
		执行子代码
elseprint('请输入正确的手机号')		

代码量十分精简明了。

正则表达式是一门独立的语言,主要依靠特殊符号去判断筛选数据,在任意的编程语言中都使用,只不过在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位是出生的年份。”

身份证:{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]}
        """
    )

感谢看完!

今日小结

学到了新鲜的知识!!!!!


  1. \d ↩︎

posted @   Eason辰  阅读(383)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示