正则表达式
在Python中使用正则表达式
- 用
import re
导入正则表达式模块. - 用
re.compile()
函数创建一个 Regex 对象 (使用原始字符串r''
) . - 调用 Regex 对象的
search()
方法传入想要查找的字符串, 并返回一个 Match 对象. - 调用 Match 对象的
group()
方法, 返回实际匹配文本的字符串.
1
2
3
4
5
6
7
8
import re
phoneNumRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
searchStr = input('Enter: ')
mo = phoneNumRegex.search(searchStr)
if not mo: print('NO MATCH!')
else:
print('phone number found: ', mo.group())
修改正则表达式为 (\d{3})-(\d{3}-\d{4})
, 第一对括号对应 group(1)
, 第二对括号对应 group(2)
.
向 re.compile()
函数传入第二个参数 re.IGNORECASE
或 re.I
, 使正则表达式不区分大小写.
常用的匹配
Regex | Match |
---|---|
Batman|Tina Fey | Batman or Tina Fey |
Bat(man|women) | Batman or Batwomen |
Bat(wo)?man | words before '?' is optionalmatchs same as above |
Bat{3} | BatBatBat |
Bat{3,5} | matches word ‘Bat’ repeated 3-5 times e.g. ‘hahahahaha’ we get ‘hahahahaha’ |
Bat{3,5}? | similar to above but matches word as few as possible e.g. ‘hahahahaha’ we get ‘hahaha’ |
Bat{3,} Bat{,5} | matches word ‘Bat’ repeated more than 2 times matchs word ‘Bat’ repeated less than 6 times |
用 sub()
方法替换字符串
Regex 对象的 sub()
方法有两个参数, 第一个参数是用来替代的字符串, 第二个是待匹配的字符串.
1
2
3
4
5
6
import re
namesRegex = re.compile(r'Agent \w+')
stg = 'Agent Alice gave the secret documents to Agent Bob'
stg = namesRegex.sub('Unknown', stg)
print(stg)
可在第一个参数中用 \1, \2...
表示用匹配得到的分组 (Group) 1, 2…的文本进行替换.
1
2
3
4
5
6
import re
namesRegex = re.compile(r'Agent (\w)\w*')
stg = 'Agent Alice gave the secret documents to Agent Bob'
stg = namesRegex.sub(r'\1****', stg)
print(stg)
方法 findall()
与 search()
之间的区别
findall()
方法返回 list 类型, 每个 list item 为 tuple 类型, 由匹配的所有组构成.e.g. 以匹配邮箱的正则表达式
(([a-zA-Z0-9._%+-]+)@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})
对字符串'824658314@qq.com'
进行匹配, 结果为[('824658314@qq.com', '824658314')]
.search()
方法返回 match 类型, 通过 match 对象的group()
方法来获得匹配的各个组. 另由groups()
方法获得匹配的所有组.e.g. 同上例, 由
group()
得824658314@qq.com
,group(1)
亦得824658314@qq.com
,group(2)
得824658314
.
文件读写
os.path
模块中的常用函数
函数名 | 描述 |
---|---|
join() | 将参数合成为一个路径字符串 |
abspath() | 相对路径转化绝对路径 |
isabs() | 判断是否为绝对路径 |
relpath() | 有两个参数 path 和 start , 返回从 path 到 start 的路径字符串 |
dirname() | 返回路径的目录名称 |
basename() | 返回路径的基本名称(文件名) |
split() | 返回路径目录名称和基本名称的 tuple |
getsize() | 返回文件的字节数 |
exists() | 判断文件或文件夹是否存在 |
os
模块中的常用函数
函数名 | 描述 |
---|---|
makedirs() | 创建新文件夹 |
getcwd() | 获得当前工作目录 |
chdir() | 改变当前工作目录 |
listdir() | 返回当前文件夹中所有文件名的 list |
unlink() | 删除目标文件 |
rmdir() | 删除目标文件夹,该文件夹需为空 |
调试
异常
raise
语句常出现在一个函数中, 以抛出异常. 其包含以下部分:raise
关键字.- 对
Exception()
函数的调用. - 将包含出错信息的字符串传给
Exception()
函数.
1
raise Exception('This is the error message.')
try
和except
语句常在调用函数的代码中用来处理异常.1 2 3 4
try: func(x) except Exception as err: print('An exception happened: ' + str(err))
断言
断言语句包含以下部分:
assert
关键字.- 条件 (求值为
True
或False
的表达式). - 逗号.
- 当条件为
False
时显示的字符串.
1
assert judgement == True, 'Error!'
日志
将下面的代码添加到程序顶部, 即可在程序运行时输出日志信息.
1
2
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
其中的参数 level
为日志级别, 有如下选项:
级别 | 描述 |
---|---|
DEBUG | 最低级别, 用于小细节. |
INFO | 记录程序中的一般事件, 或确认工作一切正常 |
WARNING | 表示可能的问题, 但不会阻止程序工作 |
ERROR | 记录错误, 将导致程序执行某些任务时失败 |
CRITICAL | 最高级别, 表示致命错误, 将导致程序终止 |
通过调用函数 logging.disable(level)
函数, 将禁止 level
级别及更低级别的所有日志信息.
向 logging.basicConfig()
函数中传入参数 filename='...'
以将日志保存在指定文件中.
从 Web 抓取信息
用 request
模块下载文件
通过调用 request
模块中 get()
函数, 得到对应 URL 的 Reponse
对象.
Response
对象有如下常用成员:
成员名 | 描述 |
---|---|
text | 下载的页面作为字符串存储于该成员中 |
status_code | 反映对网页的请求是否成功 |
raise_for_status() | 当下载文件出错时抛出异常 |
iter_content() | 返回包含指定字节的一段内容 |
下面的代码从指定 URL 下载文件并保存到硬盘:
1
2
3
4
5
6
7
8
import requests
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
res.raise_for_status()
txtFile = open('/Users/sameal/Desktop/1.txt', 'wb')
for chunk in res.iter_content(100000):
txtFile.write(chunk)
txtFile.close()
用 BeautifulSoup
模块解析 HTML
创建 bs4
对象的两种方法:
- 利用
request.get()
方法下载页面, 再将Response
对象的text
属性传给bs4.BeautifulSoup()
函数, 并携带第二个参数为html.parser
. - 直接向
bs4.BeautifulSoup()
函数传递一个 HTML 文件, 并携带第二个参数为html.parser
.
用 bs4
解析 HTML 的步骤:
调用
request.get()
方法获取目标页面的Response
对象.创建目标页面的
bs4
对象.调用
bs4
对象的select()
方法, 获取指定内容的 list, 其中每个元素为一个 Tag 对象.其中
select()
方法的参数为 CSS 选择器的组合. 如下代码将匹配一个<a>
标签, 这个标签直接包含在id
为page
的容器中, 该容器直接包含于符合类row-fluid
及page-wrap
的容器中.1
soup.select('.row-fluid.page-wrap > #page > a')
通过 Tag 对象的
get()
方法, 传入的参数为 Tag 对象的一个属性名, 如href
,src
等.
处理 Excel 表格
读取
openpyxl
模块在最近更新中废弃了大量 get
方法, 改为直接获取属性值.
导入 openpyxl
模块后, 调用 openpyxl.load_workbook()
函数, 返回一个代表当前 Excel 文件的 Workbook 对象, 其有如下成员:
成员名 | 描述 |
---|---|
sheetnames | 获取所有工作表的名字`` |
[] | 返回指定工作表 |
active | 返回默认工作表 |
[:] | 返回指定区域内的的所有单元格 |
rows | 返回所有行的 list |
columns | 返回所有列的 list |
每个工作表由一个 Worksheet 对象表示, 用 []
运算符能直接获得各个单元格的 Cell 对象, 也可通过调用方法 cell(row=, column=)
获得.
Cell 对象有如下成员:
成员名 | 描述 |
---|---|
value | 获取单元格的值 |
row | 获取行数 |
column | 获取列数 |
coordinate | 获取坐标 |
写入
通过调用 openpyxl.Workbook()
方法可以获得一个新的工作簿.
Workbook 对象中有一些用于写入数据的函数:
函数名 | 描述 |
---|---|
create_sheet(index=, title=) | 添加工作表 |
remove() | 删除指定工作表 传入参数为 Worksheet 类型, 而非名字 |
另外, 通过直接对属性赋值也能够起到修改工作表的作用.
在修改完成之后, 调用 Workbook 对象的 save()
方法将工作表保存在指定路径.
处理 Word 文档
在 python-docx
中, doc 文件用三种类型表示. Document 对象表示整个文档, 其包含一个 Paragraph 对象的列表, 表示文档中的段落. 每个 Paragraph 对象都包含一个 Run 对象的列表, 表示相同样式的文本. 上述三个对象均可由上级对象的属性获取.
若要向 doc 文件中写入数据, 则调用 docx.Document()
方法, 创建空白的 Document 对象. 其包含如下成员函数:
函数名 | 描述 |
---|---|
add_paragraph() | 添加新的段落 |
add_heading() | 添加标题, 传入第二个参数 0-4 代表标题的层次 |
add_picture() | 在文档末添加图像, 可选参数 width= 和 height= |
调用 Paragraph 对象的 add_run()
方法, 可添加不同格式的文本.
调用 Run 对象的 add_break()
方法, 可添加换行符. 若传入参数 docx.text.WD_BREAK.PAGE
, 可添加换页符.
另外, 通过 Paragraph 和 Run 对象的 style
属性, 可改变文本样式.
处理 CSV 文件
Python 中内置用来处理 CSV 文件的模块 csv
, 在程序开头导入即可.
将 CSV 文件路径作参数传给 csv.reader()
函数, 得到与文件相关联的 Reader 对象. 将 Reader 对象传递给 next()
函数, 返回一个 list, 其中元素为文件下一行各列的数据. 将上述列表作参数传给 enumerate()
函数, 返回该行中各列元素索引及其值构成的 tuple.
如下代码获得 CSV 文件中首行各元素的索引及值:
1
2
3
4
5
6
7
8
import csv
with open('pcc-master/chapter_16/sitka_weather_07-2014.csv') as csvFile:
reader = csv.reader(csvFile)
header_row = next(reader)
for idx, column_header in enumerate(header_row):
print(idx, column_header)
遍历 Reader 对象可访问 CSV 文件各行, 通过 []
运算符可得到该行各列元素.
处理 JSON 文件
Python 中内置用来处理 JSON 文件的模块 json
, 在程序开头导入即可.
将 JSON 文件路径作为参数传给 json.load()
函数, 即可获得文件中所有 dict 值构成的 list. 之后按照对 dict 的处理方式即可方便的对 JSON 文件进行处理.
数据可视化
pyplot
模块
导入 pyplot
模块的代码:
1
import matplotlib.pyplot as plt
pyplot
模块中的函数:
函数名 | 描述 |
---|---|
figure() | 生成空白画布 |
plot() | 传入两个 list 对象, 绘制对应的折线图在空白画布上 |
scatter() | 传入一组坐标或两个 list 对象,生成对应的散点图 |
show() | 显示绘制的图象 |
x/ylabel() | 设置 $x/y$ 轴的名称 |
x/ylim() | 设置 $x/y$ 轴标度的最大值和最小值 |
x/yticks() | 设置 $x/y$ 轴标度的范围和步长, 传入 np.linspace |
tick_params() | 设置坐标轴刻度的样式 |
title() | 设置标题 |
axis() | 传入包含四个元素的 list , 设置坐标轴的取值范围 |
savefig() | 保存生成的图象 |
上述函数中还能传入其他参数:
参数名 | 描述 |
---|---|
figsize= | 设置图形的尺寸, 传入一个 tuple |
linewidth= | 设置绘制线条的宽度 |
linestyle= | 设置线条样式, 如'-','-.' 等 |
s= | 设置绘制散点的尺寸 |
color= | 设置散点的颜色 |
cmap= | 配合 color= 使用颜色映射 |
fontsize= | 设置字号 |
edgecolor= | 设置数据点边缘色 |
更详细的内容在 Mathematics Module 板块中.
pygal
模块
pygal
模块中的成员:
成员名 | 描述 |
---|---|
Bar() | 创建条形图对象 |
_title | 设置或取得图表的标题 |
x/y_labels | 设置或取得 $x$ 轴和 $y$ 轴的标度 |
_x/y_title | 设置或取得 $x$ 轴和 $y$ 轴的名称 |
add() | 传入指定值的标签和指定值的列表, 填充到条形图中 |
render_to_file | 将图表保存到文件 |
处理日期
datetime
模块中 datetime
类的 strptime()
方法, 能够解析日期字符串, 其第一个参数为 str 对象, 第二个参数有多个可选值:
paraName | Description |
---|---|
%A | name of week, e.g. Monday |
%B | name of month, e.g. January |
%m | month expressed by number(01-12) |
%d | day expressed by number(01-31) |
%Y | 4-digit year, e.g. 2018 |
%y | 2-digit years e.g. 18 |
%H | hour expressed in 24-hour format |
%I | hour expressed in 12-hour format |
%p | am or pm |
%M | minute (00-59) |
%S | second (00-59) |