1.re模块
import re
使用python操作正则表达式的一个模块
我们使用这个模块 只需要 自己写正则表达式 和 带匹配的字符
模块名.方法名()
1.findall 返回所有满足匹配条件的结果,放在列表里
import re ret=re.findall("d+","s1dd22d3") print(ret) #['1', '22', '3'] ###findall分组和优先级效果 import re ret = re.findall('[a-z]d','ab2748cdef14g239') print(ret) #['b2', 'f1', 'g2'] ret = re.findall('([a-z])d','ab2748cdef14g239') print(ret) #['b', 'f', 'g'] ##去掉分组的效果: ret = re.findall('(?:[a-z])d','ab2748cdef14g239') print(ret) #['b2', 'f1', 'g2'] ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') print(ret)
2.search方法:两个参数,正则表达式和待匹配的字符串
返回的是第一个满足条件的项
使用.group()方法就可以获取到具体的值
需要注意的是,如果没有匹配上,使用.group()会报错
所以应该在使用group防止之前做判断
import re ret = re.search('a', 'eva agon yuan') print(ret) #<_sre.SRE_Match object; span=(2, 3), match='a'> if ret: print(ret.group()) #a ret = re.search('b', 'eva egon yuan') print(ret.group()) #报错AttributeError ##分组 import re ret = re.search('([a-z])d','ab2748cdef14g239') print(ret.group()) #b2直接获取正则规则匹配到的项 print(ret.group(1)) #如果给group传递参数,那么传递的参数能够代表在正则表达式中组的次序
3.match.自带^效果。同search,不过尽在字符串开始处进行匹配.需要用group
import re ret = re.match('a', 'eva agon yuan').group() print(ret) #AttributeError ret = re.match('av', 'ava agon yuan').group() print(ret) #av
4.split切割
ret=re.split("d","s1ss22dd") #默认全部分割 print(ret) #['s', 'ss', '', 'dd'] ret=re.split("d","s1ss22dd",1) print(ret) #['s', 'ss22dd'] ret = re.split('[ab]', 'a1b2c3d4') print(ret) # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 2.split的优先级查询:使用分组,保留切割对象 import re ret=re.split("(d)","s1ss22dd") #默认全部分割 print(ret) #['s', '1', 'ss', '2', '', '2', 'dd']
5.sub替换
import re ret=re.sub("d","J","sd1f4s8") print(ret) #sdJfJsJ ret=re.sub("d","J","sd1f4s8",1) print(ret) #sdJf4s8 参数限制替换的个数
6.subn 返回一个元组(结果,替换个数)
import re ret=re.subn("d","J","sd1f4s8") print(ret) #('sdJfJsJ', 3)
7.compile 进行编译,节省时间
import re od=re.compile("d{3}") #正则表达式编译一下得到一个结果,规则要匹配的是3个数字 ret=od.search("as1234ds") #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #123
8.finditer 返回一个迭代器,节省空间
import re ret=re.finditer("d","as1234ds") # print(next(ret).group()) #1 #查看第一个结果 # print(next(ret).group()) #2 #查看第二个结果 print([i.group() for i in ret]) #['1', '2', '3', '4']
9.r 取消这个字符串中的转译作用
凡是出现且没有特殊意义的时候都可以在字符串的前面加上r符号 r'\n' r' ' r'app tp' ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>") #l没有特殊意义 print(ret.group())
二.collections模块
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
from collections import namedtuple Point=namedtuple("Point",["x","y"]) p=Point(2,5) print(p) #Point(x=2, y=5) print(p.x,p.y) #2 5
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
队列:先进先出 双端队列:从两端操作
from collections import deque q=deque([1,2,3]) #增加 q.append(5) print(q) #deque([1, 2, 3, 5]) q.appendleft(88) print(q) #deque([88, 1, 2, 3, 5]) #删除 q.pop() print(q) #deque([88, 1, 2, 3]) q.popleft()
3.OrderedDict: 有序字典
from collections import OrderedDict dic=dict([("a",1),("b",2)]) print(dic) #{'a': 1, 'b': 2} od=OrderedDict(dic) print(od) #OrderedDict([('a', 1), ('b', 2)])
4.defaultdict: 带有默认值的字典
from collections import defaultdict dic=defaultdict(list) print(dic["k"],dic["k1"]) #(1) () dic=defaultdict(list) dic["k"]=1 print(dic["k"],dic["k1"]) #() () 使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict: from collections import defaultdict dic=defaultdict(None) print(dic["k"]) #KeyError: 'k' dic=defaultdict(lambda : "nonum") dic["k1"]=2 print(dic["k"],dic["k1"]) #nonum 2
5.Counter: 计数器,主要用来计数
Counter类的目的是用来跟踪值出现的次数。以字典的键值对形式存储,其中元素作为key,其计数作为value。 from collections import Counter C = Counter('abcdeabcdabcaba') print(C) #Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
三.random模块
###随机小数
print(random.random()) #无参数。在0<=n<1之间生成一个随机浮点数 print(random.uniform(1,5)) #有参数。在指定范围生成一个随机浮点数 ###随机整数 应用:验证码 print(random.randint(1,5))# 在指定范围生成一个随机整数 print(random.randrange(1,10)) ##从指定范围内,按指定基数递增的集合中获取一个随机数 print(random.randrange(1,10,2))
##从序列中获取一个或多个随机元素
应用:抽奖 print(random.choice("jerd")) print(random.choice([1,2,3])) 从集合中抽取数据 print(random.sample(li,2)) 获取指定长度的片断
用于将一个列表中的元素打乱
li=['12',"sd",123] random.shuffle(li) print(li)
验证码
验证码纯数字 import random def f_code(): code="" for i in range(0,6): num=random.randint(0,9) code=code+str(num) return code print(f_code()) #验证码:数字和字母结合 import random def f_code(): code="" for i in range(0,6): num=random.randint(0,9) alp=chr(random.randint(65,90)) #chr()的参数为0--255时,返回当前整数对应的ascii字符 #alp=random.randint(A,Z) #运行错误,返回的是整数 choice=random.choice([num,alp]) code=code+str(choice) return code print(f_code())
匹配标签
import re #<>内容相同 ret = re.search('<(?P<tag>w+)>(w+)</(?P=tag)>',"<h1>hello</h1>") print(ret.group()) print(ret.group('tag')) #<>内容不同 ret = re.search('<(?P<tag>w+)>(w+)</(?P<mag>w+)>',"<h1>hello</h2>") print(ret.group('tag')) print(ret.group('mag')) print(ret.group())
匹配整数
import re ret=re.findall("d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #d+.d+ | d+ ret=re.findall("d+.d+|(d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove('') print(ret)
匹配小数:d+.d+
匹配数字(包过整数):d+.?d*
在既有整数和小数中只匹配整数:d+.d+|(d+)