常用模块之re模块以及正则表达式扩展

什么是模块?

常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

但其实import加载的模块分为四个通用类别: 

  • 使用python编写的代码(.py文件)
  • 已被编译为共享库或DLL的C或C++扩展
  • 包好一组模块的包
  • 使用C编写并链接到python解释器的内置模块

为何要使用模块?

如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

模块的使用

若想要使用一个模块,应该在程序开始的地方导入该模块,用  import 模块名

注意:

永远不要起一个py文件的名字,这个名字和你已知的模块同名

re模块中用到的几种方法

查找

findall:匹配所有内容,形成一个列表,每一项都是列表中的一个元素

ret = re.findall(‘\d+‘,‘sjkhk172按实际花费928‘) #正则表达式匹配 多位数字,对象是后面的字符串
print(ret) >>> [‘172‘, ‘928‘]
ret = re.findall(‘\d‘,‘sjkhk172按实际花费928‘) # 正则表达式匹配数字print(ret) >>> [‘1‘, ‘7‘, ‘2‘, ‘9‘, ‘2‘, ‘8‘]

search:只匹配符合条件的从左到右的第一个,得到的不是直接结果,而是一个变量,通过此变量的group方法来获得最后结果

如果没有匹配到符合条件的,则会返回None,使用group会报错

日常使用推荐用search,findall因一次找到所有匹配项,占内存, match相当于search的正则表达式中加了一个"^"

ret = re.search(‘\d+‘,‘sjkhk172按实际花费928‘)
print(ret)  >>><re.Match object; span=(5, 8), match=‘172‘># 内存地址,这是一个正则匹配的结果
print(ret.group()) >>> 172# 通过ret.group()获取真正的结果

ret = re.search(‘\d‘,‘owghabDJLBNdgv‘)
print(ret)
print(ret.group()) #正则没有匹配到,所以会报错

ret = re.search(‘\d+‘,‘sjkhk3256按实际花费928‘)
if ret :   # 内存地址,这是一个正则匹配的结果
    print(ret.group()) >>> 3256 # 通过ret.group()获取真正的结果

match:从头开始匹配,相当于search中的正则表达式加上一个"^"

ret = re.match(‘\d+‘,‘132sjkhk按156实际花费928‘)
print(ret.group()) >>> 132

字符串处理的扩展

split:切割

s = ‘alex83taibai40egon25‘
ret = re.split(‘\d+‘,s)
print(ret) >>> [‘alex‘, ‘taibai‘, ‘egon‘, ‘‘] # 以数字切割,切割对象后面默认有一个字符

sub:替换

sub(旧,新,对象,替换次数)

ret = re.sub(‘\d+‘,‘H‘,‘alex83taibai40egon25‘) # 默认全部替换
print(ret) >>> alexHtaibaiHegonH

ret = re.sub(‘\d+‘,‘H‘,‘alex83taibai40egon25‘,1)  #替换一次
print(ret) >>> alexHtaibai40egon25

subn:也是替换,不过会返回一个元组,元组中第一个原始是替换后的结果,第二个元素是替换的次数

ret = re.subn(‘\d+‘,‘H‘,‘alex83taibai40egon25‘)
print(ret) >>> (‘alexHtaibaiHegonH‘, 3)

re模块的进阶

compile:节省使用正则表达式解决问题的时间,将正则表达式编译成字节码,多次使用过程中不会再多次编译,直接拿来用

ret = re.compile(‘\d+‘)   # 已经完成编译了
print(ret)  >>> re.compile(‘\\d+‘) #编译成原型
res = ret.findall(‘alex83taibai40egon25‘) # 拿来直接用
print(res)  >>> [‘83‘, ‘40‘, ‘25‘]
res = ret.search(‘sjkhk172按实际花费928‘) #可以多次使用,不用再次编译
print(res.group()) >>> 172

finditer:节省使用正则表达式解决问题的空间,也就是内存

返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值 能够节省内存

ret = re.finditer(‘\d+‘,‘alex83taibai40egon25‘)
print(ret) >>><callable_iterator object at 0x000001FE0DEE11D0> #调用/得到迭代器
for i in ret:
    print(i.group()) >>> 83 40 25

正则表达式的分组在re模块中的使用

#正常使用的正则表达式
s = ‘<a>wahaha</a>‘  # 标签语言 html 网页
ret = re.search(‘(<\w+>)(\w+)(</\w+>)‘,s)
print(ret.group())  >>> <a>wahaha</a> # 所有的结果
print(ret.group(1))  >>> <a># 数字参数代表的是取对应分组中的内容 第一个分组中的
print(ret.group(2)) >>> wahaha # 第二个分组中内容
print(ret.group(3))  >>> </a>

不在re模块中的正则表达式有分组

正则表达式的分组在热模块中,为了findall也可以顺利取到分组中的内容,有一个特殊的语法,优先显示分组中的内容

s = ‘<a>wahaha</a>‘
ret = re.findall(‘(\w+)‘,s)
print(ret)  >>> [‘a‘, ‘wahaha‘, ‘a‘]
ret = re.findall(‘>(\w+)<‘,s)  #优先寻找匹配括号中的内容
print(ret) >>> [‘wahaha‘]

如果想取消分组优先

形式:(?:正则表达式)

ret = re.findall(‘\d+(\.\d+)‘,‘1.234*4‘)
print(ret) >>> [‘.234‘]

ret = re.findall(‘\d+(?:\.\d+)‘,‘1.234*4‘) #取消了分组优先
print(ret) >>> [‘1.234‘]

分组命名

形式: (?P<这个组的名字>正则表达式)

对于正则表达式来说 有些时候我们需要进行分组,来整体约束某一组字符出现的次数  (\.[\w]+)?

对于python语言来说 分组可以帮助你更好更精准的找到你真正需要的内容 <(\w+)>(\w+)</(\w+)>

python和正则表达式之间有特殊的约定,要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致

s = ‘<a>wahaha</a>‘
pattern = ‘<(?P<tab>\w+)>(\w+)</(?P=tab)>‘
ret = re.search(pattern,s)
print(ret.group()) >>> <a>wahaha</a>
#与 正则表达式(<\w+>)(\w+)(</\w+>)效果是一样的
#如果正则表达式中有一模一样的表达式 就可以命名这个表达式,后面就可以直接套用名字

正则表达式使用技巧

#若我们现在想在一个字符串中取出所有的整数,我们是不是这么写
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
#我们打印看看
print(ret) >>> [‘1‘, ‘2‘, ‘60‘, ‘40‘, ‘35‘, ‘5‘, ‘4‘, ‘3‘]
#结果将其中小数分开也匹配上了,跟我们的需求不一样,因为我们是要取整数的,所以,我们要这么写.
原因:你要匹配的内容太没有特点了 容易和你不想匹配的内容混在一起

ret = re.findall(r"\d+\.\d+|\d+","1-2*(60+(-40.35/5)-(-4*3))")#将小数和整数都匹配出来
print(ret) >>> [‘1‘, ‘2‘, ‘60‘, ‘40.35‘, ‘5‘, ‘4‘, ‘3‘]
ret = re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) >>> [‘1‘, ‘2‘, ‘60‘, ‘‘, ‘5‘, ‘4‘, ‘3‘]
ret.remove(‘‘)
print(ret) >>> [‘1‘, ‘2‘, ‘60‘, ‘5‘, ‘4‘, ‘3‘]

原文地址:https://www.cnblogs.com/--kai/p/9495190.html

时间: 2024-08-29 17:39:44

常用模块之re模块以及正则表达式扩展的相关文章

python常用模块(1):collections模块和re模块(正则表达式详解)

从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来说我们应该先解释模块概念性东西再来学习具体的模块使用.可是直接解释可能反而不好理解,模块的使用非常方便,所以我们采用先介绍使用常用模块过两天再具体进行模块概念的讲解. 预习: 实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998

python os、sys模块、时间模块、正则表达式

python os.sys模块 OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块中的接口并不是所有平台都通用,有些接口的实现是依靠特定平台下的接口的.在OS模块中提供了一系列访问操作系统功能的接口,便于编写跨平台的应用. OS模块常用命令 os.getcwd()--得到当前工作的目录 os.chmod("usr/local",7) --给文件/目录加权限 os.

Python常用模块——系统调用os模块

Python常用模块--系统调用os模块 OS模块 os模块提供了很多允许你的程序与操作系统直接交互的功能. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录:os.removedirs(r"c:\python") 检验给出的路径是否是一个文件:os.path.isfile() 检验给出的路径是否是一个目录:os.path.isdir(

python中常用的内建模块

[datetime] datetime是python处理日期和时间的标准库 获取当前日期和时间 我们先看如何获取当前日期和时间: 注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类. 如果仅导入import datetime,则必须引用全名datetime.datetime. datetime.now()返回当前日期和时间,其类型是datetime. 获取指定日期和时间 要

Python中常用的模块(OS模块)

一.Python OS模块介绍 OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> import os #导入os模块>>> help(os)   #查看os模块帮助文档,里面详细的模块相关函数和使用方法 二.OS模块重要函数和变量: 1 ).os.sep 更改操作系统中的路径分隔符.2 ).os.getcwd()获取当前路径,这个在Python代码中比较常用.3 ).os.

Python常用的内建模块

PS:Python之所以自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用.下面就来看看一些常用的内建模块. datetime dateime是Python中处理日期和时间的标准库. 获取当前日期和时间 原文地址:https://www.cnblogs.com/yunche/p/8999052.html

Python 常用模块(1) -- collections模块,time模块,random模块,os模块,sys模块

主要内容: 一. 模块的简单认识 二. collections模块 三. time时间模块 四. random模块 五. os模块 六. sys模块 一. 模块的简单认识 模块: 模块就是把装有特定功能的代码进行归类的结果引入模块的方式: (1) import 模块 (2) from 位置 import 模块 二. collections模块 collections模块主要封装了一些关于集合类的相关操作. 如我们学过的iterable,iterator等等.除此以外, collections还提

python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,在python中.一个.py文件就称为一个模块(Module) 使用模块的好处: 提高了代码的可维护性. 其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们编写程序的时候也经常引用其他模块,包括python的内置的模块和第三方模块. 包(package

Python常用模块——系统调用sys模块

Python常用模块--系统调用sys模块 sys 模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') #标准输出 , 引出进度条的例子