当前位置:网站首页>第壹章模块大全之《re模块》

第壹章模块大全之《re模块》

2022-08-10 14:59:00 华为云

文章目录

前言

模块的相关概念

       1. 什么是模块

       2. 使用模块的好处

模块的使用

       1. 自定义模块

一、re模块下的基本使用方法

1、findall方法

2、search方法

3、match方法

4、spilt方法

5、sub方法

6、subn方法

7、compile方法

8、finditer方法

9、注意事项

 1、findall的优先级查询

 2、 split的优先级查询



前言

模块的相关概念

        1. 什么是模块

       模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。模块的英文名叫: modules,一个模块中可以包含N个函数,也可以包含类等等。在Python中一个扩展名为.py的文件就是一个模块。

       2. 使用模块的好处

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

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

  •  方便其他程序和脚本的导入并使用
  • 避免函数名和变量的冲突
  • 提高代码的可维护性
  • 提高代码的可重用性

模块的使用

       1. 自定义模块

       创建一个.py文件,名称尽量不要与Python自带的标准模块名称相同,需要见名知意

一、re模块下的基本使用方法

要使用re模块前必须要熟悉掌握正则表达式的使用规则,如果不会的话可以看如下博客

正则表达式的使用方法----->> http://t.csdn.cn/0V8cl

1、findall方法

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

语法:

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


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

参数:

  • pattern 匹配模式。
  • string 待匹配的字符串。
  • pos 可选参数,指定字符串的起始位置,默认为 0。
  • endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

栗子:

#匹配字符串中的‘X’print(re.findall('x','zai_xia_zhou_zhou'))#匹配字符串中的‘a’print(re.findall('a','zai_xia_zhou_zhou'))#匹配字符串中的小写字母且尽可能多的匹配print(re.findall('[a-z]+','zai_xia_zhou_zhou'))输出结果:['x']['a', 'a']['zai', 'xia', 'zhou', 'zhou']


2、search方法

re.search 扫描整个字符串并返回第一个成功的匹配就结束。findall是返回所有成功匹配的,search只返回第一个成功匹配的。

函数语法:

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

函数参数说明:

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

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

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

栗子:

'''从前往后,找到一个就返回'''ret1 = re.search('a','zai_xia_zhou_zhou')'''返回的变量需要调用group方法才能出结果,但如果没有找到就返回None,调用group方法会报错'''ret2 = re.search('a','zai_xia_zhou_zhou').group()print(ret1)print(ret2)输出结果:<re.Match object; span=(1, 2), match='a'>a


3、match方法

re.match 必须从字符串的第一个位置开始就能够往下匹配到,匹配上的内容必须调用group才能显示,如果不是起始位置匹配成功的话,match()就返回none,调用group会报错

函数语法

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

函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

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

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

栗子:

#想要匹配字符串中的i,但是匹配不到ret1 = re.match('i','zai_xia_zhou_zhou')ret2 = re.match('zai','zai_xia_zhou_zhou')print(ret1)print(ret2)print(ret2.group())输出结果:None<re.Match object; span=(0, 3), match='zai'>zai


4、spilt方法

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

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

参数:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
maxsplit分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。
flags

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

栗子:

#先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割ret = re.split('[ab]','abcd')print(ret)输出结果:['', '', 'cd']


 5、sub方法

可以使用sub()方法来进行查询和替换,sub方法的格式为:

格式

sub(replacement, string[, count=0])

参数

  • replacement      是被替换成的文本
  • string                 是需要被替换的文本
  • count                 是一个可选参数,指最大被替换的次数
#将数字替换成'z',参数1表示只替换1个ret1 = re.sub('\d','z','1ai_xia_2hou_3hou',1)#将数字替换成'z',没有参数默认是全部替换ret2 = re.sub('\d','z','1ai_xia_2hou_3hou')print(ret1)print(ret2)输出结果:zai_xia_2hou_3houzai_xia_zhou_zhou


6、subn方法

subn方法与sub方法类似,只不过subn会将替换的次数和替换后的结果通过元组的形式返回给你。

栗子:

import reret1 = re.subn('\d','z','1ai_xia_2hou_3hou',1)ret2 = re.subn('\d','z','1ai_xia_2hou_3hou')print(ret1)print(ret2)输出结果:('zai_xia_2hou_3hou', 1)('zai_xia_zhou_zhou', 3)


7、compile方法

compile 函数

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

语法格式为:

re.compile(pattern[, flags])

参数:

  • pattern : 一个字符串形式的正则表达式
  • flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    • re.I 忽略大小写
    • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    • re.M 多行模式
    • re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
    • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    • re.X 为了增加可读性,忽略空格和' # '后面的注释
import re#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字obj = re.compile('\d{3}')#正则表达式对象调用search,参数为待匹配的字符串ret1= obj.search('abc123eeee')ret2= obj.search('abc456eeee34dcsf77')print(ret1.group())print(ret2.group())输出结果:123456

compile方法的使用场景:

当一条正则规则需要反反复复的使用且比较长

8、finditer方法

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

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

参数:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
栗子:
import reret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器print(ret)  # <callable_iterator object at 0x0000024B7330EC70>print(next(ret).group())  #查看第一个结果print(next(ret).group())  #查看第二个结果print([i.group() for i in ret])  #查看剩余的左右结果输出结果:<callable_iterator object at 0x0000024B7330EC70>34['7', '8', '4']

栗子

ret = re.finditer('\d', 'ds3sy4784a')  for i in ret:    print(i)ret = re.finditer('\d', 'ds3sy4784a')for i in ret:    print(i.group())输出结果:<re.Match object; span=(2, 3), match='3'><re.Match object; span=(5, 6), match='4'><re.Match object; span=(6, 7), match='7'><re.Match object; span=(7, 8), match='8'><re.Match object; span=(8, 9), match='4'>34784


9、注意事项

 1、findall的优先级查询

ret = re.findall('www.(baidu|csdn).com', 'www.csdn.com')print(ret)  # 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可ret = re.findall('www.(?:baidu|csdn).com', 'www.csdn.com')print(ret)输出结果:['csdn']['www.csdn.com']


 2、 split的优先级查询

#在匹配部分加上()之后所切出的结果是不同的,#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,#这个在某些需要保留匹配部分的使用过程是非常重要的。ret=re.split("\d+","eva3egon4yuan")print(ret) ret=re.split("(\d+)","eva3egon4yuan")print(ret) 输出结果:['eva', 'egon', 'yuan']['eva', '3', 'egon', '4', 'yuan']
原网站

版权声明
本文为[华为云]所创,转载请带上原文链接,感谢
https://bbs.huaweicloud.com/blogs/369601