re模块
一、什么是模块:
常见的场景:一个模块就是一个包含了python定义和声明的文件
二、为何要使用模块:
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久
保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
三、模块的导入应该在程序开始的地方
四、re模块
re模块下的常用方法 import re print(re.findall("a","eva egon yuan")) #['a', 'a'] 返回所有满足匹配条件的结果,放在列表里 print(re.search("a","eva egon yuan").group()) #a 1.函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象, 2.两个参数,正则表达式和待匹配的字符串,返回的是第一个满足条件的项 该对象可以通过group()方法获取到具体的值,如果字符串没有匹配, 使用.group()会报错,所以应该在使用group防止之前做判断 print(re.match("a","aeva egon yuan").group()) #a 同search,不同的是match方法的正则自带^效果 ret = re.search("([a-z])(\d)","ab2748cdef14g239") print(ret.group()) #b2 #直接获取正则规则匹配的项,内容示意 print(ret.group(1)) #b #如果给group传参数,那么传递的参数能够代替在正则表达式中组的次序 print(ret.group(2)) #2 #从而获取到对应次序上的值 print(re.split("[ab]","abcd")) #['', '', 'cd'] 先按”a“分割得到 " " 和 "bcd" ,再对“bcd”进行分割 " " ,"cd"
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个 print(ret) #evaHegon4yuan4
print(re.subn("\d","H","eva3egon4yuan4")) #('evaHegon4yuan4', 3) 将数字替换成“H”,返回元组(替换的结果,替换了多少次)
print(re.compile("\d{3}").search('abc123eeee').group()) #123
将正则表达式编译成一个正则表达对象,规则要匹配的是3个数字 正则表达式对象调用search,
参数为待匹配的字符串
res = re.finditer('\d', 'ds3sy4784a') #<callable_iterator object at 0x000001A8D8D07860> print([i.group() for i in res])
#['3', '4', '7', '8', '4'] findier 返回一个存放匹配结果的迭代器
findall的优先级 print(re.findall("www.(baidu|oldboy).com","www.oldboy.com")) #['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可,?:是取消权限 print(re.findall("www.(?:baidu|oldboy).com","www.oldboy.com")) #['www.oldboy.com'] print(re.findall("[a-z]\d","ab2748cdef14g239")) #['b2', 'f1', 'g2'] print(re.findall("([a-z])\d","ab2748cdef14g239")) #['b', 'f', 'g'] 在findall 的正则表达式中有分组,仍然按照正则规则取匹配,只不过在显示的时候,只显示分组的内容 print(re.findall("(?:[a-z])\d","ab2748cdef14g239")) #['b2', 'f1', 'g2'] findall中取消分组 split的优先级查询 print(re.split("\d+","eva3egon4yuan")) #['eva', 'egon', 'yuan'] print(re.split("(\d+)","eva3egon4yuan")) #['eva', '3', 'egon', '4', 'yuan'] 在匹配部分加上()之后所切出的结果是不同的 没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项 这个在某些需要保留匹配部分的使用过程是非常重要的 练习题: 1.匹配标签(分组命名) import re ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") print(ret.group("tag_name")) #h1 print(ret.group()) #<h1>hello</h1> 还可以在分组中利用?P<name>的形式给分组起名字 获取的匹配结果可以直接用group("名字")拿到对应的值 ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>") print(ret.group()) #<h1>hello</h1> print(ret.group(1)) #h1 如果不给组起名字。也可以利用\序号来找到对应的组,表示要找的内容和前面的组内容 一致,获取的匹配结果可以直接用group(序号)拿到对应的值 2.匹配整数(有一些干扰项需要排除) import re ret = re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove("") print(ret) #['1', '-2', '60', '5', '-4', '3'] 3.r取消这个字符串中转译作用 凡是出现\且没有特殊意义的时候都可以在字符串的前面加上r字符 r"\\n" r"\n" 例子:(路径和正则表达式) r"\app\ntp" flags有很多可选值: re.I(IGNORECASE)忽略大小写,括号内是完整的写法 re.M(MULTILINE)多行模式,改变^和$的行为 re.S(DOTALL)点可以匹配任意字符,包括换行符 re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用 re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释