文章目录
正则表达式概念
1是一种文本模式,这种模式描述了在搜索文本时,所要匹配的一个或者多个字符串
2即正则表达式本身就是一个字符串,由一些英文字符以及特殊字符(原字符)这种模式,来匹配一个或者多个内容。
3即可以来搜索匹配 我们想要的内容。
4正则表达式是一个字符串构成由字面值和元字符组成,一方面即平时看到的字面值:如字符,该是什么含义就是什么含义,即普通字符。元字符:/d /w,这些具有特殊含义的成为元字符。
5正则表达式中/具有转义的功能。
6字面值又分为普通字符和需要转义的字符。需要转义的字符:即要加个/,这样才能够表达原始含义。如普通字符c就是c。需要转义的字符有:如你想描述/,因为正则表达式中/具有转义的功能,所以要想真正就匹配/,即必须写两个即//,才能表示原始的一个斜杠/。否则只写一个/意思就变了,即不是斜杠了。
匹配规则
1正则表达式中的定义的元字符目的是匹配一些单字,如匹配一个数字一次可用/d .点可匹配所有的字符一次,除过换行/n以外。\D匹配所有非数字等同于[0-9],即代表取反。\w匹配所有大小写字母加数字加下划线。其他如下图所示:
2批量备选,yes|no代表2选1,即可以选择yes,也可以选择no
3若想匹配一定数量的字符。即量词如下图有:
其中匹配特定范围如{3,5}表示匹配3到5次之间。
4贪婪:指的是找的是满足条件的最大匹配结果,如下图将匹配出满足这个的最大的范围了。
5非贪婪,可以.*?即
.*? #注意因为.匹配任意字符一次,加上*匹配字符变为多次,即量词,而?也是量词,所以此时这种形式定义为非贪婪模式,记住。
6边界匹配,如匹配行首,行尾等,如下:
正则用法(RegexObject)
1正则对象
#Python正则表达式即可以匹配ASCII码中的字符,也可以匹配unicode字符库中的所有字符
#Python中所用模块re
import re
text='Tom is 8 years old . Mike is 25 years old.'
#两种方式,匹配所需字符串。
#方式1,通过将定义的模式即元字符这种模式先编译成一个中间的字节码结果,并存在一个变量如pattern中,
# 此时即有了模式对象pattern,这种方法目的是在重用这种模式匹配时可以提高效率,即多用于重复使用的场景。
#就可以先提前将模式编译成中间结果存储到一个变量中,之后即可以反复使用了。
pattern=re.compile('\d+')#匹配数字1次或多次 #pattern即为模式对象了。
pattern.findall(text)#即用编译好的模式pattern去字符串text中匹配出所有的满足匹配的结果出来。
print(pattern.findall(text))#测试结果:['8', '25']
#方式2
re .findall('\d+',text)#匹配模式,加去text对象中匹配,适用于临时查找一下满足要求的匹配结果。
尽管是字面值,但是在字面值中有一部分需要转义,包括\ $等都是需要转义才可以打印匹配出他自身。
#所以匹配\要写两个\\即前面的转义符,后边才是真正/,所以匹配//,即要用四个//了
import re
s='\\author:tom'
re.findall('\\\\author',s)
#结果['\\author']
#也可以加r忽略转义,即保持原字符,不要转义。如即也可以匹配到双//了
s1=re.compile(r'\\author')
s1.findall(s)
['\\author']
2 findall直观,返回满足的所有匹配结果放在一个列表中。
mport re
text='Tom is 8 years old . Mike is 25 years old.'
re.findall('[A-Z]\w+')#匹配A-Z范围内的一个字符,加字母或数字多次即\w+
re.findall('[A-Z]\w+',text)#匹配A-Z范围内的一个字符,加字母或数字多次即\w+
['Tom', 'Mike']
3
注:[]可选参数,如可以选起始匹配坐标索引包括在内,以及终止匹配坐标索引不包括。返回的是匹配对象。
#match默认必须从起始的字符串开始匹配,返回一个对象,若起始对应不上,就匹配不到。
#match默认从起始开始匹配
import re
s='<html><head></head></html>'
pattern=re.compile(r'<html>') ##默认匹配原字符,不要转义加上r
pattern.match(s)#记住:返回为空不成功,若返回有个匹配对象,即匹配成功了。
<_sre.SRE_Match object; span=(0, 6), match='<html>'>
s=' <html><head></head></html>'
pattern.match(s,1)#指定从第二个字符匹配,不要从开始匹配。即索引为1
<_sre.SRE_Match object; span=(1, 7), match='<html>'>
4 search可以从任何位置去匹配,并将匹配到的结果返回。
注[]为可选参数,以逗号相隔。
s=' <html><head></head></html>'
pattern=re.compile(r'<html>')
pattern.search(s)#span,即起始从第一个字符匹配到了,到底7结束了。
<_sre.SRE_Match object; span=(1, 7), match='<html>'>
5返回的是一个包含匹配对象元素的迭代器
总结正则对象:
进一步观察MathObject对象的细节
可以通过match,search返回MathObject即匹配对象,可以对每个分组的细节进行观察。
以下这个满足这种模式的匹配结果只有一种,
text='Tom is 8 years old . jerry is 23 years old.'
pattern=re.compile(r'(\d+).*?(\d+)')#分两个组,中间可以出现任何字符0次或多次,这样可坑能会最大范围匹配,所以加上?表示非贪婪模式。#只有加了括号的才是分组,不加的不叫分组,如:.*?
#返回MathObject进一步分析各分组细节
m=pattern.search(text)
m
<_sre.SRE_Match object; span=(7, 32), match='8 years old . jerry is 23'>
m.group()#看各组的整体
'8 years old . jerry is 23'
m.group(0)#表示取整体
'8 years old . jerry is 23'
m.group(1)#找的是第一个分组
'8'
m.group(2)#找的是第二个分组的结果
'23'
m.start(1)#找第一个分组的下标索引。
7
m.start(2)#找第2个分组的下标索引。
30
m.end(1)#找第一个分组的结束下标索引。
m.end(1)#找第一个分组的结束下标索引。
8
m.groups()#找到所有的内容返回一个元组
('8', '23')
m.groupdict()#返回为空的字典表,因为尽管定义了分组,但并没有为分组起名称。
{}
进一步观察Group编组对象
注:对于有编组即括号的匹配是匹配模式中包含括号与不包含括号的都匹配,但只返回括号中的结果。
1场景1,创建子正则应用量词。
2 场景2:限制备选项范围
import re
re.search(r'Center|re','Center')#可以匹配两者其一。即Center或re
<_sre.SRE_Match object; span=(0, 6), match='Center'>
re.search(r'Center|re','Centre')#可以匹配两者其一。即Center或re
<_sre.SRE_Match object; span=(4, 6), match='re'>
#此时只会匹配re,若想匹配因为英式的为Center,美式为Centre,可以通过分组指定备选
re.search(r'Cent(er|re)','Centre')#可以匹配两者其一。即Center或re
<_sre.SRE_Match object; span=(0, 6), match='Centre'>
re.search(r'Cent(er|re)','Center')#可以匹配两者其一。即此时为Center或Centre了
<_sre.SRE_Match object; span=(0, 6), match='Center'>
3场景3
#可以重现前面第一个编组,即r'(\w+) \1'注意中间有空格,且必须从1开始即\1
re.search(r'(\w+) \1','hello hello world')
<_sre.SRE_Match object; span=(0, 11), match='hello hello'>
re.search(r'(\w+) \1','hello hello hello world')#只能重现两次,所以匹配的是前面的两个hello hello
<_sre.SRE_Match object; span=(0, 11), match='hello hello'>
re.search(r'(\w+) \1','hello hello hello hello world')#索引为1只能匹配前面的两个hello hello
<_sre.SRE_Match object; span=(0, 11), match='hello hello'>
re.search(r'(\w+) (\w+) \2','hello hello hello hello world')
<_sre.SRE_Match object; span=(0, 17), match='hello hello hello'>
#注意索引\1是有一个分组即\1代表第一个分组,所以当只有一个分组时,只能是\1,不可以是\2,因为没有第二个分组。
上i面最后一个有两个分组,但\2是将第二个分组再现一次,,即可以了,因为有第二个分组存在,所以可以再现。
4声明分组,可以取名字几种方式
正则综合应用
字符串
1切割
2替换
注:中间作为一个整体的分组,匹配两个*之间的东西,且最小范围,即非贪婪所以加?
即定义的分组,在表现中可以引用了
可以替换字符串原有格式:如下图:
编译标记
1忽略大小写
2
总:
模式清除
逃逸函数,即可以抛开字符本来的含义
系统工具
如在mac操作系统有终端,如windows中有doc 或命令行工具来管理系统工具。在linux有shell脚本。
sys系统模块
1
2
platform看运行的操作系统如win32
version看版本信息
path看搜索路径,一般我们能在pycharm中调用自己模块或包,就是按这个路径自动找的,所以自动才运行了。
modules所载入的模块功能有哪些。
3 观察异常的具体信息。
可以只看回溯这个错误信息,即将索引变为2即可。
以上sys内容总结
4 sys.argv函数捕获并返回一个列表。
将在编辑器中写一个.py文件并保存。如图:
可以在windows命令中运行这个文件。
如下图:
发挥作用,让直接的捕获参数可以直接执行我文件中的逻辑功能,如加法add
运行示意图:
5 标准流
上面中的输入、输出与下边的sys下的操作一样。
sys.stdout()输出后面还加了输出字符的个数。
总结:
OS模块常用功能组件
1查看Python的环境变量,如在这可以看到Python安装的一些路径。
2看目录,管理目录工具
、
3运行shell命令,如在windows中就是win+r+cmd运行命令符即可。
pycharm的terminal
当在Python中若用操作系统的组件可以导入os模块,如下图
所以可以在Python环境中直接可以替代在操作系统即命令交互式提示符来完成的目录与文件管理了。
os.path工具
通过Python命令操作符完成,可以兼顾不同的操作系统。完成文件,路径等操作。
1文件操作
2可移植工具
3 OS下的模块专门有个Path模块处理路径