Python学习笔记(七)
1. 正则表达式
正则表达式的设计思想就是用一种描述性的语言来给字符串定义一个规则,凡符合规则的字符串,我们就认为它“匹配”了。
正则表达式基础参考链接: http://dengchaosheng.com/2016/02/23/e3e500f06f55d6dbeb63866429423b00/
re模块
Python的字符串本身也用\转义,所有要特别注意,一般用r前缀。
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345') # match()方法判断是否匹配,匹配成功,返回一个Match对象,否则返回None
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
# 常用判断方法
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print('ok')
else:
print('failed')
切分字符串
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
分组
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
贪婪匹配:匹配尽可能多的字符串,正则表达式默认是贪婪匹配;
非贪婪匹配:匹配尽可能少的字符串。
编译
当我们在Python中使用正则表达式时,re模块内部会干两件事:
- 编译正则表达式,如果正则表达式的字符串本身不合法,会报错
- 用编译后的正则表达式去匹配字符串
>>> import re
# 预编译:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
2. 常用内建模块
datatime: 时间模块
>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>
collections: 集合模块
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
base64: 用64个字符来表示任意二进制数据的方法
struct: 解决bytes和其他二进制类型的转换
>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'
hashlib: 摘要算法(通过一个算法,把任意长度的数据转换成一个固定长度的数据串)
# 计算出一个字符串的MD5值
import hashlib
md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
itertools: 提供非常有用的用于操作迭代对象的函数
xml:
- DOM: 会把整个xml读入内存,解析为树。因此占用内存大,解析慢,优点是可以任意遍历树的节点
SAX: 流模式,边读边解析,占用内存小,解析快,缺点是需要自己处理事件,正常情况下,优先考虑SAX。
HTMLParser: 解析Html,把网页中的文本,图像等解析出来。
from html.parser import HTMLParser
from html.entities import name2codepoint
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print('<%s>' % tag)
def handle_endtag(self, tag):
print('</%s>' % tag)
def handle_startendtag(self, tag, attrs):
print('<%s/>' % tag)
def handle_data(self, data):
print(data)
def handle_comment(self, data):
print('<!--', data, '-->')
def handle_entityref(self, name):
print('&%s;' % name)
def handle_charref(self, name):
print('&#%s;' % name)
parser = MyHTMLParser()
parser.feed('''<html>
<head></head>
<body>
<!-- test html parser -->
<p>Some <a href=\"#\">html</a> HTML tutorial...<br>END</p>
</body></html>''')
urlib: 操作URL的功能。
urlib的request模块可以非常方便的抓取URL内容,发送一个get请求到指定的页面。返回HTTP的响应。
如果以post发送一个请求,只需把参数data以bytes形式传入。
3. 常用第三方模块
所有的第三方模块都会在https://pypi.python.org/pypi上注册,只需要找到对应的模块名字,即可用pip安装。
Pillow: 图像处理标准库
# 安装Pillow
$ pip install pillow
# 操作图像
from PIL import Image
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 获得图像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 缩放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把缩放后的图像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')
# 模糊效果
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')
virtualenv
每个应用在开发中都可能各自拥有一套独立的Python运行环境。virtualenv就是用来创建一套隔离的Python运行环境。
# 安装virtualenv
$ pip3 install virtualenv
# 创建目录
Mac:~ michael$ mkdir myproject
Mac:~ michael$ cd myproject/
Mac:myproject michael$
# 创建运行环境
Mac:myproject michael$ virtualenv --no-site-packages venv
Using base prefix '/usr/local/.../Python.framework/Versions/3.4'
New python executable in venv/bin/python3.4
Also creating executable in venv/bin/python
Installing setuptools, pip, wheel...done.
感谢廖雪峰的官方网站提供的教程。Python学习笔记系列都基于廖老师的教程