Python系列模块之标准库re详解

    感谢点赞和关注 ,每天进步一点点!加油!

目录

一、Python 正则表达式

1.1 re模块常用操作

1.2 re.match

1.3 re.search

1.4 re.findall

1.5 re.compile 函数

1.6 re.sub 检索和替换

1.7 re.split拆分

1.8 实战案例:根据文件名匹配文件并移动


一、Python 正则表达式


正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

  • re 模块使 Python 语言拥有全部的正则表达式功能。
  • compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
  • re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

1.1 re模块常用操作


模块+函数(方法)

描述

re.match()

开头匹配,类似shell里的^符号

re.search()

整行匹配,但只匹配第一个

re.findall()

全匹配并把所有匹配的字符串做成列表

re.split()

以匹配的字符串做分隔符,并将分隔的转为list类型

re.sub()

匹配并替换

1.2 re.match


re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。

函数语法

re.match(pattern, string, flags=0)

函数参数说明

参数

描述

pattern

匹配的正则表达式

string

要匹配的字符串。

flags

标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法

描述

group(num=0)

匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups()

返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例:

import re

print(re.match("aaa", "sdfaaasd"))    # 结果为none,表示匹配未成功
print(re.match("aaa", "aaasd"))    	  # 有结果输出,表示匹配成功

abc = re.match("aaa\d+", "aaa234324bbbbccc")
print(abc.group())  			   # 结果为aaa234324,表示打印出匹配那部分字符串

执行结果:

1.3 re.search


re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明

参数

描述

pattern

匹配的正则表达式

string

要匹配的字符串。

flags

标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法

描述

group(num=0)

匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups()

返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例:

import re

# 有结果输出,表示匹配成功;re.search就是全匹配,而不是开头(但只返回一个匹配的结果);想开头匹配的话可以使用^aaa
print(re.search("hadoop", "sdfhadoopsdhadoopwwsdf")) 

# 验证,确实只返回一个匹配的结果,并使用group方法将其匹配结果打印出来
print(re.search("hadoop\d+", "hadoop111222bbbbccchadoop333444").group()) 

执行结果:

1.4 re.findall


在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 ,findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

函数参数说明

参数

描述

string

待匹配的字符串。

pos

可选参数,指定字符串的起始位置,默认为 0。

endpos

可选参数,指定字符串的结束位置,默认为字符串的长度。

实例:

import re

print(re.findall("hadoop", "sdfhadoopsdhadoopwwsdf")) 
print(re.findall("hadoop\d+", "hadoop111222bbbbccchadoop333444"))  

执行结果:

小结: re.search()与re.findall()

  • re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
  • 都不是开头匹配
  • re.search()只匹配一行里第一个,而re.findall()会把一行内匹配的多个都匹配出来
  • re.search()可以通过group()打印匹配的结果, re.findall()没有group()方法,直接把匹配的所有结果以列表的形式展示

1.5 re.compile 函数


compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern[, flags])

测试数据

t1.4301.jyg.qcs.ipva.cn,0,1,1,PsARegion,4#37#6#85#272#70#268#17
t1.4301.jyg.qcs.ipva.cn,0,1,1,PsCRegion,275#94#9#105#13#147#285#140
t1.py.3895.qcs.ipva.cn,0,1,1,PsDRegion,84#86#228#88#216#138#98#139
t1.py.3895.qcs.ipva.cn,1,1,1,PsARegion,77#85#239#87#218#133#99#132
t1.8381.kf.qcs.ipva.cn,0,1,1,PsBRegion,125#145#320#146#330#207#67#210
t1.8381.kf.qcs.ipva.cn,0,1,1,PsCRegion,126#143#322#146#329#208#68#210

需求:匹配到"PsARegion"的行输出

import re
f = open("/root/data.txt")  # 返回一个文件对象
line = f.readline()              # 调用文件的 readline()方法
text = ""
pattern = re.compile("PsARegion")
while line:
    if(pattern.search(line)):
       # 拼接
       text += line 
    line = f.readline()
print(text, end='')
f.close()

执行结果:正确的匹配输出了两行数据

1.6 re.sub 检索和替换


Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0, flags=0)

函数参数说明

参数

描述

pattern

正则中的模式字符串。

pos

替换的字符串,也可为一个函数。

string

要被查找替换的原始字符串。

count

模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

实例:

import re
 
phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释 
num = re.sub(r'#.*$', "", phone)
print("电话号码是: ", num)
 
# 删除非数字(-)的字符串 
num = re.sub(r'\D', "", phone)
print("电话号码是: ", num)

执行结果

1.7 re.split拆分


split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

参数:

参数

描述

pattern

匹配的正则表达式

string

要匹配的字符串。

maxsplit

分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

flags

标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

测试数据:

t1.4301.jyg.qcs.ipva.cn,0,1,1,PsARegion,4#37#6#85#272#70#268#17
t1.4301.jyg.qcs.ipva.cn,0,1,1,PsCRegion,275#94#9#105#13#147#285#140
t1.py.3895.qcs.ipva.cn,0,1,1,PsDRegion,84#86#228#88#216#138#98#139
t1.py.3895.qcs.ipva.cn,1,1,1,PsARegion,77#85#239#87#218#133#99#132
t1.8381.kf.qcs.ipva.cn,0,1,1,PsBRegion,125#145#320#146#330#207#67#210
t1.8381.kf.qcs.ipva.cn,0,1,1,PsCRegion,126#143#322#146#329#208#68#21

需求:正则匹配 “PsARegion” 的行且取出前两个列

import re
f = open("/root/data.txt")  # 返回一个文件对象
line = f.readline()              # 调用文件的 readline()方法
text = ""
pattern = re.compile("PsARegion")
while line:
    if(pattern.search(line)):
       dataList = re.split(",", line)
       line = str(dataList[0]) + "," + str(dataList[1]) + "\n"
       text += line 
    line = f.readline()
print(text, end='')
f.close()

执行结果:

1.8 实战案例:根据文件名匹配文件并移动


move_file.py

# -*- coding:UTF-8 -*-

import logging
import os
import re
import shutil
import sys
from imp import reload
from logging.handlers import RotatingFileHandler

reload(sys)

# 初始化日志    
logger = logging.getLogger('mylogger')
logger.setLevel(level=logging.INFO)
fmt = '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
format_str = logging.Formatter(fmt)
fh = RotatingFileHandler("move_file.log", maxBytes=10*1024*1024, backupCount=2,encoding="utf-8")
fh.namer = lambda x: "backup."+x.split(".")[-1]

fh.setFormatter(fmt=format_str)
logger.addHandler(fh)


def move_file(res_dir, tar_dir, pattern):
    """ 文件移动
    :param res_dir: 源路径
    :param tar_dir: 目标路径
    :param pattern: 正则匹配模式
    :return:
    """
    try:
        logger.info("开始移动文件!")
        for filename in os.listdir(res_dir):
            
            # 获取文件的完整路径
            file_path = os.path.join(res_dir, filename)
            print(filename, pattern)
			# 正则匹配文件名
            if re.match(pattern, filename):
                shutil.move(file_path, tar_dir) # 移动文件 # shutil库,它作为os模块的补充,提供了复制、移动、删除、压缩、解压
                print("已移动文件【%s】" %filename)
        logger.info("结束移动文件!")
    except Exception as why:
        print(why)
        
if __name__ == "__main__":
    print(sys.argv)
    if len(sys.argv) == 4:
        move_file(sys.argv[1], sys.argv[2], sys.argv[3])

在Windows 上调用

python.exe D:\\IPVA\\file_move\\move_file.py  D:\\IPVA\Data_Traffic\\DataServerCloud01_AlarmEvent\\  D:\\IPVA\Data_Traffic_Bak\\DataServerCloud01_AlarmEvent\\  Data.*.COMPLETED

移动成功, 之后我又做了ren重命名


参考:

Python 正则表达式 | 菜鸟教程

Python四种逐行读取文件内容的方法 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能分析和优化一…

vs code 配置net 开发环境.并搭配vs相似的解决方案面板

由于在本人在Linux22.04下安装Rider 一直处于卡死系统状态.不得不使用该方式 以下为安装步骤 安装 VS code https://code.visualstudio.com/Download 安装 mono https://www.mono-project.com/download/stable/#download-lin 安装 NET SDK https://learn.microsoft.com/zh…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭;有的品牌通过狂追当下Z世代的喜好,推翻经典设计;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下,羽绒服行业正在经历“地位”洗牌。 目前&…

如何在WordPress页面上显示或隐藏小部件?

您想在 WordPress 网站的特定页面上显示或隐藏小部件吗? 默认情况下,当您将小部件添加到您的网站时,它们将显示在所有页面上。但是,有时您可能只想在某些页面上显示选定的小部件可以帮助您更好地自定义您的网站并提供个性化的用户…

有哪些好用的App云测试平台?

一、国内外6种好用app云测平台推荐(章节末附pk图) 1、国内云测平台 1)Testin云测 网址:https://www.testin.cn/ Testin云测平台是一款基于云端的移动应用测试平台,为移动应用开发者和测试人员提供一站式的移动应用质…

让数据背后的那些话创造价值 | 数据增长

从行业背景而言,流量红利逐渐消失,野蛮生长的互联网时代接近尾声。传统的烧钱模式、靠体力投放的形式日渐乏力。但是,企业总是要追求增长的。所以在行业大背景下,依靠技术和数据的力量寻求更科学、更高效的方法达成营销目标&#…

关注 | 蛙色元宇宙,正式成为XRMA联盟成员单位

中国虚拟现实与元宇宙产业峰会,2023年3月22日于杭州圆满结束,在杭州市人民政府、浙江省经济和信息化厅指导,由杭州市经济和信息化局、杭州市西湖区人民政府主办,中国信息通信研究院承办。 蛙色元宇宙作为元宇宙的领先企业之一&…

springboot旅游资源管理系统门票酒店预订系统_b0a6b

Spring Boot 是 Spring 家族中的一个全新的框架,它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM(Spring MVC Spring MyBatis )框架进行开发的过程。config:主要用来存储配置文件&#…

凹函数和凸函数

凹函数英文concave,凸函数英文concave。 在有些参考资料中,凸函数又称为下凹(concave down)函数,凹函数称为上凹(concave up)函数。 凹函数和凸函数根据判定方法的不同,分为以下两类: 一元函…

虚幻商城模型转MetaHuman

一、导入虚幻商城的模型到UE 1.去虚幻商城下载一个人物模型,这里以SchoolGirl为例 2.导入UE,并找到模型,这里是SkeletalMesh 二、启动MetaHuman插件 1.通过Edit->Plugins启用MetaHuman和MetaHumanSDK插件,这里MetaHuman插件是用于创建MetaHuman的,MetaHumanSDK插件…

会声会影2023最新完整版免费下载

会声会影2023操作简单,功能同样强大!会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具,如调色、遮罩、绿幕抠像、运动追踪、分屏创建器,满足更高标准的视频需求。这款软件上手操作简单易学,就算你在…

C++ 初始模板

模板 void Swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; }void Swap(double* x, double* y) {double tmp *x;*x *y;*y tmp; }void Swap(char* x, char* y) {char tmp *x;*x *y;*y tmp; } 如上述所示,我们在实现函数的时候,有很多函数会像…

第四届“中国法研杯”司法人工智能挑战赛-刑期预测赛道三等奖方案

一、前言 本文将回顾第四届“中国法研杯”司法人工智能挑战赛-刑期预测算法赛道比赛。使用多任务预训练、然后进行微调的形式最终在比赛中取得了三等奖的成绩。 二、任务介绍 主办方在第一届“中国法研杯”比赛上提出了刑期预测任务,本届将针对往届刑期预测准确率…

(学习日记)AD学习 #1

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

Leetcode452. 用最少数量的箭引爆气球

Every day a Leetcode 题目来源:452. 用最少数量的箭引爆气球 解法1:排序 贪心 题解:用最少数量的箭引爆气球 我们首先随机地射出一支箭,再看一看是否能够调整这支箭地射出位置,使得我们可以引爆更多数目的气球。…

既然有了IP地址,为什么还需要MAC地址?两者到底有啥区别,深入分析后终于明白了!

在计算机网络中,IP地址和MAC地址是两个最基本的概念。IP地址在互联网中是用于标识主机的逻辑地址,而MAC地址则是用于标识网卡的物理地址。虽然它们都是用于标识一个设备的地址,但是它们的作用和使用场景是不同的。 IP地址是在网络层&#xff…

logstash同步数据从kafka到es集群

背景:需求是这样的,原始文件是txt文件(每天300个文件),最终想要的结果是每天将txt中的数据加载到es中,开始的想法是通过logstash加载数据到es中,但是对logstash不太熟悉,不知道怎么讲…

基于SpringBoot的生鲜管理系统的设计与实现

背景 困扰交易市场的许多问题当中,生鲜交易管理一定是交易市场不敢忽视的一块。但是管理好生鲜交易又面临很多麻烦需要解决,例如有几个方面:第一,生鲜市场往往人数都比较多,如何保证能够管理到每一个商家,如何在工作琐碎,记录繁多的情况下将生鲜交易的当前情况反应给领导相关部…

柔顺机构学读书笔记1:悬臂梁变形

题目: 如图考虑悬臂梁,材料各向同性,即各个方向上的弹性模量和强度都相同。如果在x方向上作用一个可使最大应力等于屈服强度 S S S的力 F x F_x Fx​时, x x x轴方向的变形为多少,书上给出了答案: 我们来验…

2022级云曦实验室考试(一)pwn

讲真,俺都不知道pwn是啥,等俺搜搜! pwn简介: CTF中的pwn指的是通过通过程序本身的漏洞,编写利用脚本破解程序拿到主机的权限,这就需要对程序进行分析,了解操作系统的特性和相关漏洞&#xff0…