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'\n'
r'\app\ntp'
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+)