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

这篇具有很好参考价值的文章主要介绍了【Python】系列模块之标准库re详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python re,python基础学习,python,re模块,shutil模块,search

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

目录

一、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系列之Windows环境安装配置_开着拖拉机回家的博客-CSDN博客

Python系列之变量和运算符_开着拖拉机回家的博客-CSDN博客

Python系列之判断和循环_开着拖拉机回家的博客-CSDN博客

Python系列之字符串和列表_开着拖拉机回家的博客-CSDN博客

Python系列之文件操作和函数_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库OS详解_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库re详解_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库json详解_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库shutil详解_开着拖拉机回家的博客-CSDN博客


一、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,表示打印出匹配那部分字符串

执行结果:

python re,python基础学习,python,re模块,shutil模块,search

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()) 

执行结果:

python re,python基础学习,python,re模块,shutil模块,search

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"))  

执行结果:

python re,python基础学习,python,re模块,shutil模块,search

小结: 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()

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

python re,python基础学习,python,re模块,shutil模块,search

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)

执行结果

python re,python基础学习,python,re模块,shutil模块,search

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()

执行结果:

python re,python基础学习,python,re模块,shutil模块,search

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 re,python基础学习,python,re模块,shutil模块,search

参考:

Python 正则表达式 | 菜鸟教程

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

python re,python基础学习,python,re模块,shutil模块,search

 文章来源地址https://www.toymoban.com/news/detail-770063.html

 

到了这里,关于【Python】系列模块之标准库re详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python标准库 subprocess 模块多进程编程详解

    subprocess 模块,允许生成新的进程执行命令行指令,python程序,以及其它语言编写的应用程序, 如 java, c++,rust 应用等。 subprocess可连接多个进程的输入、输出、错误管道,并且获取它们的返回码。 asyncio也支持subprocess. 许多知名库都在使用此模块创建进程,以及做为跨语言粘合

    2024年02月02日
    浏览(36)
  • Python基础篇(十六)-- Python标准库模块之heapq与bisect

    1.1 介绍         堆是非线性的树形的数据结构,有2种堆,最大堆与最小堆。Python 的 heapq 模块默认的是最小堆。堆数据结构最重要的特征是 heap[0] 永远是最小的元素。 最大堆:树中父节点的值总是大于等于任意子节点的值 最小堆:树中父节点的值总是小于等于任意子节

    2023年04月08日
    浏览(34)
  • 《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 webbrowser 是Python的内置库,提供了访问Web浏览器的接口 使用前需要 「导入模块」 1)使用 「默认浏览器」 打开

    2024年02月10日
    浏览(44)
  • 《Python入门到精通》time模块详解,Python time标准库,time库函数大全

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》

    2024年02月09日
    浏览(50)
  • 【Python】re模块

    正则表达式其本身就是一种小型的,高度专业化的编程语言。在Python中,它被内 嵌在了re模块里面,正则表达式模式被编译成一系列的字节码,然后由用C编写的匹 配引擎执行。 re.search 扫描整个字符串并返回第一个成功的匹配。 语法: 参数 描述 pattern 匹配的正则表达式 s

    2024年02月09日
    浏览(35)
  • python re 模块 正则表达式

    ^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串) $ 表示匹配字符串的结束位置 * 表示匹配 零次到多次(记忆方法: 符号是星星,天上的星星可以是无数个也可以看不到 ) + 表示匹配 一次到多次 (记忆方法: 符号是加号,增加

    2024年02月13日
    浏览(47)
  • python re 模块 findall 函数用法简述

    import re s = \\\"adfad asdfasdf asdfas asdfawef asd adsfas \\\"   reObj1 = re.compile(\\\'((w+)s+w+)\\\') reObj1.findall(s) [(\\\'adfad asdfasdf\\\', \\\'adfad\\\'), (\\\'asdfas asdfawef\\\', \\\'asdfas\\\'), (\\\'asd adsfas\\\', \\\'asd\\\')]   reObj2 = re.compile(\\\'(w+)s+w+\\\') reObj2.findall(s) [\\\'adfad\\\', \\\'asdfas\\\', \\\'asd\\\']   reObj3 = re.compile(\\\'w+s+w+\\\') reObj3.findall(s) [\\\'adfad asdfasdf\\\', \\\'as

    2024年01月18日
    浏览(41)
  • Python-re模块-正则表达式模块常用方法

    Python的re模块提供了正则表达式的功能,可以用来进行高级的字符串匹配和处理。re模块的主要功能包括: 编译正则表达式 - 使用re.compile()可以编译正则表达式字符串,生成正则表达式对象。 匹配字符串 - 使用正则表达式对象的match()、search()、findall()等方法可以在字符串进行匹配

    2024年02月14日
    浏览(45)
  • Python模块学习:subprocess模块详解

    subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法,如: 1.subprocess模块中的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数。执行指定的命令

    2024年02月13日
    浏览(37)
  • Python 爬虫之 requests模块(ua伪装、代理、cookies、防盗链 Referer)、re模块、xpath模块、selenium

    下载 发送 get 请求 案例:百度 发送 post 请求 案例:百度翻译 UA 伪装 代理 cookies 登录 案例:17k小说网 防盗链 Referer 案例:梨视频 findall search finditer 预加载 提前写好正则表达式 匹配换行 re.S 在 html 中使用 原子组使用别名 爬取豆瓣电影 https://movie.douban.com/chart lxml.etree.XMLSy

    2024年01月24日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包