#collections模块#namedtuple: 给元祖中的元素定义。from collections import namedtuple# stuct_time = namedtuple('l_time',('year','month','day','mday','wday'))# tu = stuct_time('2018','5','21','108','1')# print(tu.year)#queue: 数据容器,先进先出。进去的数据放在一个黑盒中,看不到# import queue# l = queue.Queue()# l.put(1)# l.put(2)# print(l.get()) #第一个值 1#deque 双向队列,可以两边加入.append() .appendleft() .pop() .popleft()from collections import deque# l = deque()# l.append(1)# l.appendleft(2)# print(l)# print(l.pop()) #默认删除最后一个#OrderedDict: 使字典有序 ([(,),(,),(,)])from collections import OrderedDict# dic = OrderedDict([('a',2),('c',1),('b',3)])# print(dic)# dic['z'] = 1# print(dic)#defalutdict:设置默认值# from collections import defaultdict# dic = defaultdict(list) #设置默认值是[]# print(dic['a']) #查找的时候自动将‘键’和默认的值加进去# print(dic['b'])# print(dic)
#正则表达式#一、判断字符串是否符合要求#二、找到一串字符串中符合要求的内容#字符组 [] : 约束一个字符,可以设置范围。#元字符 \w[数字、字母、下划线] \s[空格、\n\t] \d[数字] : 与字符组一样,只能约束一个字符。# \W 非 \S 非 \D 非#^ ...: 字符串必须以...开头。一定要放在...前面。 [^ ...]: 非...#$ :字符串必须以...结尾。一定要放在...后面。#^...$ : 匹配的内容必须是中间的... 一模一样的。#| : 或。 例:ab | abc则会找到ab就停止,所以前面一定要放长的。#匹配11位电话号码:# print(re.findall('1[3-9]\d{9}','18842697252')) #字符组的范围[3-9]中间是- 。# 控制\d的出现次数:# {9} \d出现9次# {1,} \d出现至少1次# {1,4} \d出现1~4次都行,不少于1次不多于4次# + 1次或以上# * 0次或以上# ? 0次或1次#身份证号:#第一种:# ret = re.search('[1-9]\d{14}(\d{2}[\dx])?','211121199910112005')# print(ret.group())#第二种(用或“|”)# ret = re.search('^[1-9]\d{16}[\dx]|[1-9]\d{14}$','211121199910112005888')# print(ret.group())# print(re.findall('>.*?<','>hoagnejdhoagnejd<#\ :转意#.*?:表示找到?后面的字符前重复最小次数。最小0次。直到找到时停止。#如果不加?,则*会没有限制然后一直找到最后,再回溯回来找< 。#结果就会为 >hoagnejd <#findall:生成一个列表。找到所有符合条件的结果,然后放到一个列表里。# print(re.findall('\d+','123jsdha889')) #['123','889']#默认只显示分组中的值。解决:(?: ...)如:# print(re.findall('\w{1}(\d+)','_123'))# print(re.findall('\w{1}(?:\d+)','_123')) #再分组中加?: 则改变默认输出。# g = re.findall('\d+\.\d+|(\d+)','hae12hoa385h40.35ha') #取字符串中的整数# g.remove('') #对整数分组以后,小数显示出来是空格,然后去掉空格,就能取到字符串中的整数了。# print(g) #或者的情况,其中一个分组以后,另一种情况的结果显示空格。#search: 生成一个对象,找到符合条件的第一个结果。# g = re.search('\d+','hai8374jah22jh')# print(g.group()) #8374#match: 生成一个对象,必须以正则的条件开头,结果为开头的字符串。# g = re.match('ab','ab888')# print(g.group())#split:生成一个列表。以正则的条件分割。# print(re.split('\d+','joiae83nhe93nd9304nw'))#多个字母的话,字母要放在[]中,就从左到右依次分割。# print(re.split('[ohn]','joiae83nhe93nd9304nw'))#sub/subn: sub是按照正则的'旧''新'来替换字符串中的字符。 subn是除替换后的结果还有替换了的次数# print(re.sub('a','l','aunjunaie')) #生成的就是替换后的字符串# print(re.subn('a','l','aunjunaie')) #生成的是一个元祖(字符串,次数)#complie:如果同一个正则需要用很多次时,可以先将次正则编译,然后再对其它各种字符串进行操作。# ret = re.compile('\d+')# print(ret.split('183huend993jaiek33'))# g = ret.search('hehie93ni390nje0')# print(g.group())#finditer:将符合条件的结果放进迭代器中# ret = re.finditer('\d+','he00ha93dkk33m4')# ret1 = next(ret) #next()一下只显示第一条# ret2 = ret1.group()# print(ret2)# for i in ret:# print(i.group())#group(): ()中: 默认0, 全部# 1,显示第一个分组 2,显示第二个分组# 组名,显示次组的值。#需要两个分组匹配的值相等。第一种:\\1 第二种:(?P <组名> 正则) (?P= 组名) P必须大写。# ret = re.search('(?P \w+)\*(?P=tag)','h1*h1')# ret = re.search('(?P 组名>\w+)\*\\1','h1*h1') #\\1不需要分组括号。# print(ret.group())# print(ret.group(1))# print(ret.group('tag'))#爬虫
一、正则表达式
二、collections模块