一:取消转义

如果要在正则匹配真正的\n 而不是换行符 需要取消转义
在原生的正则表达式中取消转义推荐使用\(每个\只能取消一个字符的转义)\\n
在python中取消转义推荐使用r'\n\a\t'(也可以使用\)

二:python内置模块之re模块

在python要想使用正则必须借助于模块 re就是其中之一

基本操作方法
import re findall ('正则表达式', '带匹配的文本')
* 根据正则匹配出所有符合条件的数据
res = re.findall('a', 'eva jason jackson')
print(res) 从头找到尾 ['a', 'a', 'a'] 结果是一个列表
结果是一个列表(要么有元素) 报错返回空列表 search ('正则表达式', '带匹配的文件')
* 根据正则匹配(一个)符合条件的就结束
res = re.search('a','eva jason jackson')
print(res) <_sre.SRE_Match object; span=(2, 3), match='a'> # 结果对象
print(res.group()) :a 真正的结果
判断 实现代码不报错
if res:
print(res.group())
else:
print('不好意思 没有找到')
注:如果没有符合条件的数据 那么search返回None 并且使用group会直接报错 match ('正则表达式', '带匹配的文本')
* 根据正常从头开始匹配(文本内容必须在开头匹配上)
res = re.match('a','bac')
print(res) 结果对象
print(res.group()) 真正的结果
判断 实现代码错误提醒 不报错
if res:
print(res.group())
else:
print('不好意思 没有找到')
注:如果没有符合条件的数据 那么search返回None 并且使用group会直接报错
并且使用group会直接报错 三种内置模块的区别
findall 找所有 结果列表
search 找到一个就停下 结果是个对象 取值加.group
match 找开头 没有None 有也是返回对象 取值加.group

三:常用方法 findall search match 简便

 常用方法
regexp_obj = re.compile('\d+')
res = regexp_obj.search('absd213j1hjj213jk') # 找一个
res1 = regexp_obj.match('123hhkj2h1j3123') # 找开头
res2 = regexp_obj.findall('1213k1j2jhj21j3123hh') # 找所有
print(res,res1,res2)
取值加.group

四:常用方法 finditer 匹配文件多情况

常用方法 finditer
在使用爬虫等 待匹配文本多的情况下 该方法更节省内存 finditer频率更高
res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131')# 匹配迭代器
print([i.group() for i in res])
结果:['21', '23', '12', '3', '112312121', '131']
报错:返回[] findall finditer 性质相同 finditer但效率更高

五:切割 替换 内置模块

import re

  split 切割
先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
res = re.split('[ab]','abcd')
print(res) # ['', '', 'cd'] sub 替换
类似于字符串类型replace替换方法
res = re.sub('\d', 'H', 'eva3jason4yuan4', 1) # 替换正则匹配到的内容
print(res) # evaHjason4yuan4 返回文本
res1 = re.sub('\d','H','eva3jason4yuan4') # 不写默认替换所有
print(res1) # evaHjasonHyuanH 返回文本 subn 提示替换了几个
返回元组 并提示替换了几处
res = re.subn('\d', 'H', 'eva3jason4yuan4',1)
print(res) #('evaHjason4yuan4', 1) 返回元组 # :1 提示换了1个
res1 = re.subn('\d', 'H', 'eva3jason4yuan4',)
print(res1) # ('evaHjasonHyuanH', 3) 返回元组 # :3 提示换了3个

六:分组优先机制

search 分组优先机制 分组可以指定从左往右拿括号内的内容
分组可以指定从左往右拿括号内的内容
res = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$','110105199812067023')
print(res) # 结果对象 <_sre.SRE_Match object; span=(0, 18), match='110105199812067023'>
print(res.group()) # 真正的结果 110105199812067023
print(res.group(1)) # 023
取分组没分组时在取会报错 dindall 分组优先展示 无名分组
取值只先展示括号内的元素
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
print(res)
结果: ['023'] findall 取消分组优先展示 无名分组
取消分组优先展示 需要在括号内加一个 :?
res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$",'110105199812067023')
print(res1)
结果: ['110105199812067023']

七:有名分组 起别名

 有名分组
怎么给表达式起别名 需要在括号内加 ?P 再在<>内写上要起的名字
有名分组结合分组一起使用 可以做到点名字取组 不在需要索引取值了
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res)
结果: <_sre.SRE_Match object; span=(0, 18), match='110105199812067023'>
print(res.group()) # 结果:110105199812067023
print(res.group('xxx'))
结果:10105199812067
print(res.group('ooo'))
结果:023

八:正则实战案列

import re

# 读取待匹配的数据
with open(r'a.txt','r',encoding='utf8') as f:
data = f.read()
# 利用正则匹配数据
# 公司名称
title_list = re.findall('<h2>(.*?)</h2>', data)
# print(title_list) # 分公司地址
addr_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(addr_list) # 分公司邮箱
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(email_list) # 分公司电话
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
# print(phone_list) # 组合 拉链
res = zip(title_list,addr_list,email_list,phone_list)
for data_tuple in res:
with open(r'w.txt', 'a', encoding='utf8') as f1:
f1.write("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % (data_tuple))

九:collections模块

该模块内部提供了一些高阶的数据类型

1.namedtuple(具名元组)
from collections import namedtuple 两种创建具名元组的形式
namedtuple('名称',[名字1,名字2,...])
namedtuple('名称','名字1 名字2 ...') point = namedtuple('坐标',['x','y'])
res = point(11,22)
print(res) # 坐标(x=11, y=22) 代表坐标的意思
print(res.x) # 11 拿指定的位置的值
print(res.y) # 22 拿指定的位置的值 point = namedtuple('坐标', 'x y z')
res = point(11, 22, 33)
print(res) # 坐标(x=11, y=22, z=33)
print(res.x) # 11
print(res.y) # 22
print(res.z) # 33 注意事项:
具名元组有几个名字 就要有几个对应值 card = namedtuple('扑克', '花色 点数')
card1 = card('', 'A')
card2 = card('', 'K')
print(card1)
print(card1.花色)
print(card1.点数)

十:队列 双端队列

1.队列模块
import queue 内置队列模块:FIFO
初始化队列
q = queue.Queue() 括号内写上数字限制位数 不写无穹位
往队列中添加元素
q.put('first')
q.put('second')
q.put('third')
从队列中获取元素
print(q.get())
print(q.get())
print(q.get())
结果:先进先出
'''
first
second
third
''' 2.双端队列  
from collections import deque    
q = deque([11,22,33])    
q.append(44)   从右边添加    
q.appendleft(55)   从左边添加    
print(q.pop())   从右边取值  
print(q.popleft())   从做边取值
结果:双端队列
'''
44
55
'''

十一:默认值字典

 默认值字典
from collections import defaultdict
常规操作
ll = [11, 22, 33,44,55,66,77,88,99,90]
将大于60的数放入字典k2对应的列表内 小于60的数字放入字典k1对应的列表
new_dict = {'k1': [], 'k2': []}
for i in ll:
if i > 60:
new_dict.get('k2').append(i)
else:
new_dict.get('k1').append(i)
print(new_dict) 默认值字典
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>60:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(my_dict)

十二:计数器 统计元素出现的次数

res = 'abcdeabcdabcaba'
统计字符串中每个元素出现的次数
代码实现
new_dict = {}
for i in res:
if i not in new_dict: # 判断i没有在字典里面出现过
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict) 使用模块实现
计数器
from collections import Counter
ret = Counter(res)
print(ret) 也可以统计列表中出现的次数
ref = Counter(['the', 'foo', 'the', 'foo', 'the', 'defenestration','the'])
print(ret)
Counter({'the':4, 'foo':2, 'defenstration':1})

十三:time模块

时间三种表现形式
1.时间戳(秒数)
2.结构化时间(一般是给机器看的)
3.格式化时间(一般是给人类看的)
三种时间是可以互相转化的!!!
1.time.sleep() 原地阻塞指定的秒数
2.time.time() 获取时间戳时间 import time
格式化时间
print(time.strftime('%Y-%m-%d')) 2021-11-25
print(time.strftime('%Y-%m-%d %H:%M:%S')) 2021-11-25 11:48:34
注:%X 可以直接使用功能代替 时,分,秒
print(time.strftime('%Y-%m-%d %X')) 2021-11-25 11:48:34

十四:时间相关符号

时间相关符号
print(time.localtime())
输出得出:
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=25, tm_hour=19, tm_min=57, tm_sec=43, tm_wday=3, tm_yday=329, tm_isdst=0) 支分:
print(time.localtime())
time.struct_time(
tm_year=2021,
tm_mon=11,
tm_mday=25,
tm_hour=11,
tm_min=51,
tm_sec=25,
tm_wday=3,
tm_yday=329,
tm_isdst=0)

十五:时间戳 结构化时间 格式化时间

import time

时间戳
print(time.time())
结果:1637842537.2742932
结构化时间
print(time.gmtime())
结果:time.struct_time(tm_year=2021, tm_mon=11, tm_mday=25, tm_hour=12, tm_min=17, tm_sec=19, tm_wday=3, tm_yday=329, tm_isdst=0)
本地时间
print(time.localtime())
结果:time.struct_time(tm_year=2021, tm_mon=11, tm_mday=25, tm_hour=20, tm_min=15, tm_sec=37, tm_wday=3, tm_yday=329, tm_isdst=0) 本地时间东八区 结构化时间UTC东零区 就相差八个小时 时间戳转结构化时间
print(time.gmtime(time.time()))



时间戳转成格式化时间需要localtime 或者 gmtime

结果话时间转时间戳 mktime

使用率最高:

结构化时间转成格式化时间 strftime

十六:datetime模块 获取日期 时间相减

import datetime
print(datetime.date.today()) 2021-11-25
print(datetime.datetime.today()) 2021-11-25 12:15:11.969769
date年月日 datetime年月日时分 time时分秒 today()今天(MySQL django后期可以) res = datetime.datetime.today()
print(res.year) 2021
print(res.month) 11
print(res.day) 25
print(res.weekday()) 获取星期(weekday星期是0-6) 0表示周一
print(res.isoweekday()) 获取星期(weekday星期是1-7) 1表示周一 时间差(timedelta) 时间相减 差多少时间
时间差值 方便查询时间差值 ctime = datetime.datetime.today()
time_tel = datetime.timedelta(days=3) # 三天
print(ctime) 当前时间
结果:2021-11-25 20:36:19.108453
print(ctime - time_tel) 当前时间减去三天时间
结果:2021-11-22 20:37:27.759978
print(ctime + time_tel) 当前时间加上三天时间
2021-11-28 20:39:43.630290 公式:
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
ret = ctime + time_tel
print(ret - ctime) # 3 days, 0:00:00
print(ctime - ret) # -3 days, 0:00:00

十七:UTC时间与我们的东八区时间差 八个小时

东八区 现在的时间  相差八小时
print(datetime.datetime.now()) 2021-11-25 12:25:33.579310
东零区 UTC时间为准 相差八小时
print(datetime.datetime.utcnow()) 2021-11-25 04:25:33.579310

十八:计算今年过生日

import datetime

 小练习 计算举例今年过生日还有多少天
birthday = datetime.date(2002, 9, 30)
now_date = datetime.date.today()
days = birthday - now_date
print('生日:{}'.format(birthday)) 生日:2002-09-30
print('今天的日期:{}'.format(now_date)) 今天的日期:2021-11-25
print('距离生日还有{}天'.format(days)) 距离生日还有-6996 days, 0:00:00天

python内置re模块全面实战的更多相关文章

  1. Python内置OS模块用法详解

    大家好,从今天起早起Python将持续更新由小甜同学从初学者的角度学习Python的笔记,其特点就是全文大多由新手易理解的代码与注释及动态演示.刚入门的读者千万不要错过! 很多人学习python,不知 ...

  2. Python内置标准模块

    time 模块 1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # t ...

  3. $Django 发送邮件--django封装模块和python内置SMTP模块

    一 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Header m ...

  4. Python内置logging模块

    最近调试Python代码比较多,发现logging模块很好用. 我的用法如下: import logging logging.basicConfig(level=logging.INFO, forma ...

  5. csv文件已经python内置csv模块

    csv(Comma Separated Value,即逗号分隔值),文件以纯文本形式存储表格数据(数字和文本).可以用excel打开,并自动将每个逗号隔开的数据作为一列在excel中显示. pytho ...

  6. Python 内置os模块的简单实用

    获取路径&目录添加文件 在自动化测试的过程,考虑到工程文件的移动或者在其他人的工作环境中运行,所以我们的路径要灵活,不能把路径写死. 推荐使用Python的内置模块OS 参照图 import ...

  7. Python内置GUI模块Tkinter的几点笔记

    组件属性,用法 组件位置 更多

  8. day25 内置常用模块(四): 模块和包

    阅读目录: 模块 import from xxx import xxx 包 import from xxx import xxx    from xxx  import *    __init__.p ...

  9. Python内置的urllib模块不支持https协议的解决办法

    Django站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常.寻根朔源发现是python内 ...

随机推荐

  1. 【LeetCode】42. Trapping Rain Water 接雨水 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 保存左右最大值 单调栈 日期 题目地址:ht ...

  2. 【LeetCode】370. Range Addition 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 只修改区间起终点 日期 题目地址:https://le ...

  3. hdu 1430 (BFS 康托展开 或 map )

    第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...

  4. idea使用教程-常用快捷键

    [1]创建内容:alt+insert [2]main方法:psvm [3]输出语句:sout [4]复制行:ctrl+d [5]删除行:ctrl+y [6]代码向上/下移动:Ctrl + Shift ...

  5. 另一个角度看元宇宙与RPA:人工世界、平行员工与RPA

    另一个角度看元宇宙与RPA:人工世界.平行员工与RPA 从元宇宙到平行员工,人工世界推动的虚实分工利好RPA 机器人是铁打营盘人类是流水兵,未来元宇宙的虚实分工RPA机会巨大 文/王吉伟 元宇宙是平行 ...

  6. RTD2172替代方案|TYPEC转HDMI4K@60HZ拓展坞|CS5265替代RTD2172

    瑞昱RTD2172是TYPEC转HDMI4K60HZ音视频数据转换器芯片.CS5265可以替代兼容RTD2172,除了实现同等的转换功能外且整体方案成本和性价比方面比RTD2172要高,且外围器件较少 ...

  7. Linux进程管理之基本指令

    目录 基本介绍 显示系统执行的进程 指令 ps - aux 常用选项 每行栏目的含义 查看父进程 终止进程 相关指令 实用案例 踢掉某个非法登录用户 终止远程登录服务sshd,在适当的时候再次重启ss ...

  8. 项目启动报错怎么办?看看你Spring自动注入用对了嘛?@Autowired XxxService注入问题解决

    问题 在Controller层使用 @Autowired注入Service时,提示Bean中没有Service 在Service接口中使用 @Component注入后,启动项目问题提示: The we ...

  9. Java基础周测试(一)详解

    一.单选题 (题数:30,共 150.0 分) 1.下列选项不可作为Java语言变量名的是(    ).(5.0分) A.a1            B.$1           C._1       ...

  10. JavaScript 钩子

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...