python 之常用模块
一 认识模块
二 常用模块
(1)re模块
(2)collections模块
一 认识模块
(1)什么是模块
(2)模块的导入和使用
(1)模块是:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
1 使用python编写的代码(.py文件)
2 已被编译为共享库或DLL的C或C++扩展
3 包好一组模块的包
4 使用C编写并链接到python解释器的内置模块
为什么要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
(2)模块的导入和使用
更多内容:http://www.cnblogs.com/Eva-J/articles/7292109.html
二 常用模块
re 模块
引入通过一个京东的注册例子来引入:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com
如果我们在电话号码那一栏随便写上‘11111111111’它会给出格式错误
这个功能是怎样实现的呢?
假如现在你用python写一段代码,类似:
phone_number = input('please input your phone number : ')
如何判断输入的电话号码是合法的?
根据手机号码一共11位并且是以13、14/15/17/18开头的数字这些特点,我们用python可以写了如下代码:
import re
while True: phone_number = input('please input your phone number : ') if len(phone_number) == 11 \ and phone_number.isdigit()\ and (phone_number.startswith('13') \ or phone_number.startswith('14') \ or phone_number.startswith('15') \ or phone_number.startswith('17')\ or phone_number.startswith('18')): print('是合法的手机号码') else: print('不是合法的手机号码'):
优化后的代码是:
import re while True: phone_number=input('please input your phone number:') if re.match('^(13|14|15|18|17)[0-9]{9}$',phone_number): print('是合法的手机号码') else: print('不是合法的手机号码')
re模块 和 正则表达式
他俩的关系:不管你以后是不是去做python开发,只要你是一个程序员就应该了解正则表达式的基本使用。如果未来你要在爬虫领域发展,你就更应该好好学习这方面的知识。
但是re模块本质上和正则表达式没有一毛钱的关系。re模块和正则表达式的关系,类似于time模块和时间的关系
时间有自己的格式,年月日使分秒,12个月。。。。已经成为了一种规格。time模块只不过是python提供给我们的可以方便我们操作时间的一个工具而已。
正则表达式:是匹配字符串内容的一种规则。
定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来报答对字符串的一种过滤逻辑。
正则表达式的在线测试工具http://tool.chinaz.com/regex/
我们谈到正则表达式都是跟字符串有关系。在线测试工具里,你输入的每一个字都是一个字符串。其次,如果在一个位置的一个值,不会出现什么变化,那么是不需要规则的。
如果你要用‘1’去匹配‘1’,或者用‘2’去匹配‘2’,直接可以匹配上。这些事不需要高深的理论。
那么在之后我们要更多考虑的是在同一个位置上 可以出现的字符范围。
字符组:[字符组]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示
字符分为很多类,数字、字母、标点等等。
假如你现在要求一个位置‘只能出现一个数字’,那么这个位置上的字符只能是0、1........9这个10个数之一。
re 模块的应用
import re # ret=re.findall('a','eval agen heh') # print(ret) # ret=re.search('a','aval egon hah ') # print(ret.group) # ret=re.match('a','agon avel haha').group() # print(ret) # ret=re.split('[ab]','abcd') # print(ret) # ret=re.sub('\d','H','123abade456') # print(ret) # ret=re.subn('\d','H','123abade456') # print(ret) # obj=re.compile('\d{3}') # ret=obj.search('adajfafg123wwww') # print(ret.group()) # ret=re.finditer('\d','daohgaljflahgl123456aoafhlfjaljf') # print(ret) # print(next(ret).group()) # print(next(ret).group())
findall的优先级
import re
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com') print(ret) ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com') print(ret)
split的加括号和不加括号的区别
import re # ret=re.split('\d+','afljalfjlajgl123465ddiei145q') # print(ret) # ret=re.split('(\d+)','afljalfjlajgl123465ddiei145q') # print(ret)
在匹配部分加上括号可以保留分割的数字这个在某些时候特别重要。
在匹配部分不加括号就不会保留分割的数字。
练习题:
匹配标签
import re
ret=re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)>','<h1>hello</h1>') print(ret.group()) ret=re.search(r'<(\w+)>\w+</\1>','<h1>hello</h1>') print(ret.group(1))
匹配整数
import re # ret=re.findall('\d+','1 - 2 * ( (60-30 +(-40.36/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2)') # print(ret) # ret=re.findall(r'-?\d+\.\d*|(-?\d+)','1 - 2 * ( (60-30 +(-40.36/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2)') # print(ret) # ret.remove('') # print(ret)
数字匹配
import re # while True: # s=input('>>请输入月份:').strip() # if re.match('(^(0?[1-9]|1[0-2])$)',s): # print('输入月份正确') # else: # print('格式不正确') # while True: # s=input('>>请输入qq号:').strip() # if re.match('^[1-9][0-9]{4,}$',s): # print('输入格式正确') # else: # print('格式不正确') # while True: # s=input('>>请输入一个浮点数:').strip() # if re.match('^(-?\d+)(\.\d*)?$',s): # print('输入格式正确') # else: # print('格式不正确') # while True: # s=input('>>请输入一个汉字:').strip() # if re.match('^[\u4e00-\u9fa5]{0,}$',s): # print('输入格式正确') # else: # print('格式不正确')
爬虫练习
import requests import re import json def getPage(url): response = requests.get(url) return response.text def parsePage(s): com = re.compile( '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) ret = com.finditer(s) for i in ret: yield { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num"), } def main(num): url = 'https://movie.douban.com/top250?start=%s&filter=' % num response_html = getPage(url) ret = parsePage(response_html) print(ret) f = open("move_info7", "a", encoding="utf8") for obj in ret: print(obj) data = json.dumps(obj, ensure_ascii=False) f.write(data + "\n") if __name__ == '__main__': count = 0 for i in range(10): main(count) count += 25
collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
namedtuple
# from collections import namedtuple # Point=namedtuple('Point',['x','y']) # p=Point(1,2) # print(p.x) # print(p.y)
deque用于插入和删除数据
# from collections import deque # q=deque(['x','y','z']) # q.append('a') # q.appendleft('w') # print(q)
OrderdDict 有序的字典
from collections import OrderedDict # d=dict([('a',1),('b',2),('d',5),('c',3)]) # print(d) # d1=OrderedDict([('a',1),('c',2),('d',7)]) # print(d1) # d=OrderedDict() # d['x']=1 # d['y']=5 # d['z']=9 # print(d)
defaultdict
有如下值集合 [
11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
,
90.
..],将所有大于
66
的值保存至字典的第一个key中,将小于
66
的值保存至第二个key的值中。
即: {
'k1'
: 大于
66
,
'k2'
: 小于
66
}
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = {} for value in values: if value > 66: if my_dict.get('k1'): my_dict['k1'].append(value) else: my_dict['k1'] = [value] else: if my_dict.get('k2'): my_dict['k2'].append(value) else: my_dict['k2'] = [value] print(my_dict)
另一种解法:
from collections import defaultdict values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] dic=defaultdict(list) for value in values : if value>66: dic['k1'].append(value) else: dic['k2'].append(value) print(dic)
Counter计数的
from collections import Counter c=Counter('adcddafkajljgljl') print(c)