正則表達(dá)式##
py的正則表達(dá)式只能通過字符串來表示,配合re模塊使用。由于有轉(zhuǎn)義字符的存在,為了簡便,一般都會(huì)附加r
import re
email = "opteacher@hotmail.com"
print re.match(r"^\w+@(hotmail|126|163|qq|gmail).(com|cn)(.cn)?$", email)
phone = "13918459376"
print re.match(r"^1[3|5|7|8]\d{9}$", phone)
idCard = "310114199101191314"
print re.match(r"(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)", idCard)
當(dāng)然,re也有匹配分離和提取的功能,通過re.split和match.group(n)來實(shí)現(xiàn)
實(shí)用模塊##
collections
集合類工具模塊
- namedtuple:以tuple為基礎(chǔ)定義一個(gè)類,并未其中的各個(gè)分量指定key名
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(1, 2)
不過tuple不能改變值,算是個(gè)遺憾,不過真正做起來,namedtuple也是不夠用的
- deque:鏈表(不過為何沒有中間插入?)
from collections import deque
q = deque([0, 1, 2, 3, 4, 5, 6])
q.append(7)
print q
q.pop()
print q
q.appendleft(-1)
print q
q.popleft()
print q
- defaultdict:帶默認(rèn)值的KV表,當(dāng)訪問不存在的key是返回默認(rèn)值
from collections import defaultdict
d = defaultdict(lambda: "")
d["id"] = 5
d["name"] = "op"
print d["sex"]
# 打印空字符串
- OrderedDict:排過序的dict,按定義的順序遍歷
from collections import OrderedDict
d = OrderedDict([("z", 12), ("y", 55), ("")])
- Counter:統(tǒng)計(jì)字符出現(xiàn)的個(gè)數(shù)
from collections import Counter
cc = Counter()
for c in "i am a Chinese":
cc[c] += 1
print c
base64
Base64編碼過程
對(duì)二進(jìn)制數(shù)據(jù),以每次取三個(gè)字節(jié)數(shù)據(jù)的規(guī)則,依次取數(shù)據(jù)。這樣一次獲取的數(shù)據(jù)是38=24bit,再把它分為四組24=46bit,由此得出四個(gè)索引(所以字符索引表的最大長度的2^6),根據(jù)索引得到對(duì)應(yīng)的字符替換真數(shù)據(jù)中的字符。所得出的字符串就是Base64編碼之后的字符串了。
hashlib
提供哈希加密,MD5、SHA1等。使用和JS無異
itertools
提供操作迭代對(duì)象的函數(shù)
- count(n):生成n~無限的自然數(shù)列
for i in itertools.count(1): # 1 2 3 .....
- cycle([n1, n2, ...]):循環(huán)迭代給出的序列
for i in itertools.cycle([1, 2, 3]): # 1 2 3 1 2 3 1 ...
- repeat(n, [max]):循環(huán)迭代指定的參數(shù)(1),可以通過指定第二個(gè)參數(shù)控制其迭代的次數(shù)
for i in itertools.repeat(1, 5): # 1 1 1 1 1
- chain(a1, a2, ...):相當(dāng)于Array.concat()
for i in itertools.chain([1, 2, 3], [4, 5, 6]): # 1 2 3 4 5 6
- groupby(n):將序列中相同的項(xiàng)提取出來,迭代的周期返回這個(gè)項(xiàng)和項(xiàng)出現(xiàn)的次數(shù)(序列)
for ket, group in itertools.groupby("AAABBBCCCCCCDDEE"):
print key, list(group)vv
- imap():可以用來處理無限序列的map版本
- ifilter():可以用來處理無限序列的filter版本
如果用map和filter處理無限序列,會(huì)無輸出報(bào)錯(cuò)
XML
跟一般的XML庫一樣,分兩種解析方式:DOM和SAX,DOM占用的內(nèi)存消耗大,但一旦解析完成便可以隨意操作;SAX的快速解析,遇到什么就輸出什么,用事件驅(qū)動(dòng)
HTMLParser
用于解析HTML的接口類,用回調(diào)的方式處理遇到的TAG,而且語法沒有XML那么嚴(yán)格。編寫爬蟲會(huì)用到
from HTMLParser import HTMLParser
class MyWebPageParser(HTMLParser):
def handle_starttag(self, tag, attrs):
# 處理TAG頭
def handle_starttag(self, tag):
# 處理TAG尾
def handle_startendtag(self, tag, attrs):
# 處理單TAG
def handle_data(self, data):
# 處理內(nèi)容
def handle_comment(self, comment):
# 處理注釋
def handle_entityref(self, name):
# 處理引用(估計(jì)是<meta ref="...“ ...)
def handle_charref(self, name):
# 處理字符集
myHP = MyWebPageParser()
myHp.feed("HTML代碼")
PIL(Pillow)##
py的圖片處理模塊,最新根據(jù)官網(wǎng)的文檔,通過pip安裝Pillow(不再是簡寫PIL),用from PIL import XXX引入(不再是import Image)
$ pip install Pillow
from PIL import Image
img = Image.open("media/test.jpg")
安裝和使用參照:https://pillow.readthedocs.io/en/latest/installation.html
詳細(xì)參照官方文檔:http://effbot.org/imagingbook/