概述
一、re模块与正则表达式
今天我们要整理python里的re模块和正则表达式,正则表达式不仅在python领域,在整个编程届都占有举足轻重的地位。
在没有正式介绍re模块之前我们需要先了解一下什么是正则表达式,它又与re模块有什么联系呢?
简单介绍一下正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。
正则表达式的用法
元字符
w 匹配数字字母下滑线 word关键字 [a-zA-Z0-9_]
d 匹配所有的数字 digit [0-9]
s 匹配所有的空白符 回车/换行符 制表符 空格 space [nt ]
匹配换行符 回车 n
匹配制表符 tab t
匹配空格
W D S 和w d s取反
[sS] [dD] [wW]是三组全集 意思是匹配所有字符
b 表示单词的边界
和转义字母相关的 元字符
w d s(nt) b W D S
^ 与$
^ 匹配一个字符串的开始
$ 匹配一个字符串的结束
. 表示匹配 除换行符之外的所有字符
[] 只要出现在中括号内的内容都可以被匹配
[^] 只要不出现在中括号中的内容都可以被匹配
有一些有特殊意义的元字符进入字符组中会回复它本来的意义 : . | [ ] ( )
a|b 或 符合a规则的或者b规则的都可以被匹配
如果a规则是b规则的一部分,且a规则比b规则要苛刻/长,就把a规则写在前面
将更复杂的更长的规则写在最前面
() 分组 表示给几个字符加上量词约束的需求的时候,就给这些量词分在一个组
量词
{n}表示 这个量词之前的字符出现n次
{n,} 表示这个量词之前的字符至少出现n次
{n,m} 表示这个量词之前的字符出现n-m次
? 表示匹配量词之前的字符出现 0次 或者 1次 表示可有可无
+ 表示匹配量词之前的字符出现 1次 或者 多次
* 表示匹配量词之前的字符出现 0次 或者 多次
二、re模块的使用
首先我们在使用模块的时候先要导入模块,这时必不可少的步骤。
1.findall 匹配列表中的每一个元素
1 importre2 s="q6we798qw76sa45f"
3 ret=re.findall("d",s)4 print(ret)5 #运行结果['6', '7', '9', '8', '7', '6', '4', '5']
2.search 只会匹配到第一个符合的表达式(从左到右的顺序),得到的不是直接的结果,需要用group()方法来查看。这里需要注意当没有匹配到符合
的表达式,直接打印会显示None,而通过group()方法来查看会报错
1 importre2 s="as4d98qw7e"
3 ret=re.search("d",s)4 print(ret) #运行结果:<_sre.SRE_Match object; span=(2, 3), match='4'>
5 print(ret.group()) #运行结果: 4
findall 与 search 他们的用途都是用来查找,二者的区别在于findall 可以匹配全部结果,而search 只能匹配第一个结果。
3.match 大体上与 search 用法相同,而不同点则是match默认在表达式前有 "^" 开头符号
importre
s= "123python456"re1= re.search("d+$",s)
re2= re.match("d+$",s)print(re1.group()) #运行结果 : 456
print(re2.group()) #报错 因为 match 在正则表达式前默认存在一个^,所以字符串s不是以数字开头数字结尾。
4.split 切割.
1 importre2 s = "123python456"
3 ret = re.split("d$",s)4 print(ret) #运行结果:['123python45', '']
5.sub 与 subn 替换
importre
s= "123python456"re1= re.sub("d","H",s)print(re1) #运行结果 :HHHpythonHHH
re2 = re.subn("d","H",s)print(re2) #运行结果 :('HHHpythonHHH', 6) subn会返回一个元组,元组中的第二个元素是替换的次数
6.compile 编译
compile的作用是将正则表达式编译为字节码,当多次使用时不会多次便宜,它的特点就是节省时间
1 importre2 s = "laixue1python2HAPPY"
3 obj1= re.compile("d")4 re1 =obj1.findall(s)5 print(re1) #运行结果 : ['1', '2']
6
7 obj2 = re.compile("[a-z]+")8 print(obj2.search(s).group()) #运行结果: laixue
7.finditer 返回一个存放匹配结果的迭代器,可以通过group()方法来查看结果,它的特点就是减少空间内存
1 importre2
3 s = "13245python"
4 ret = re.finditer("[a-z]",s)5 print(ret) #运行结果 : 已经可以看出是迭代器了
6
7 if ret.__iter__():8 print(True)9 else:10 print(False)11 #判断返回是否为迭代器 运行结果为True
12
13 print([i.group() for i in ret ]) #运行结果 : ['p', 'y', 't', 'h', 'o', 'n'] 所以finditer 可以用groud()方法来查看结果
分组 ( )在re模块中的使用
分组 ( ) 在正则表达式中表示分组将多个表达式统一管理后接量词来用,而在python的re模块中 " ( ) "有着不一样的用法
1.分组 ( ) 表示优先级
在search中使用
1 importre2 s = "132python456"
3 ret = re.search("d+([a-z]+)d+",s)4 print(ret.group()) #运行结果 : 132python456
5 print(ret.group(1)) #运行结果 ; python
6 #当我们在表达式中添加分组表示优先级时,通过在group() 方法中添加参数可以优先获得结果
在findall中使用
1 importre2 s = "123python456"
3 #ret = re.findall("d+([a-z]+)d+",s)
4 #print(ret) # 运行结果 : ['python']
5 #当 ( ) 在findall中使用时,而无法使用group()方法查看结果,这时默认匹配出( ) 内的结果
6 ret = re.findall("(d+)([a-z]+)d+",s)7 print(ret) #运行结果 : [('123', 'python')]
8 #当 多个( )同时使用时,会将结果以元组的形式添加到列表中
在split中使用
1 importre2 s = "132python456"
3 ret = re.split("^d+([a-z]+)",s)4 print(ret) #运行结果 : ['', 'python', '456']
5 #在split中使用时() 内的表达式被切割后会留下来。
2.取消 分组( ) 优先级 " ?:"
importre
s= "123python456"ret= re.findall("(d+)(?:[a-z]+)(d+)",s)print(ret) #运行结果 : [('123', '456')]#当在( ) 内开头加入" ?: "字符时 , 表示取消优先级
3.分组( ) 的命名 " ?P< >"
1 importre2 s = "123python123"
3 ret = re.search("(?Pd+)([a-z]+)(?P=a)",s)4 print(ret.group(0)) #运行结果 : 123python123
最后
以上就是仁爱时光为你收集整理的python中import re_python之re模块的全部内容,希望文章能够帮你解决python中import re_python之re模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复