第二部分:自动化任务
第7章 模式匹配与正则表达式
字符串操作技巧
for i in range(len(message)):
chunk = message[i:i+12] #i及以后12个
if isPhoneNumber(chunk): #判断函数
pass
1、创建正则表达式对象
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') #返回正则对象
2、匹配Regex对象
mo = phoneNumRegex.search('My number is 415-555-4242.')
3、调用Match对象的group()方法,返回实际匹配文本的字符串。
print('Phone number found: ' + mo.group())
匹配括号转义\
re.compile(r'(\(\d\d\d\))
匹配多个
re.compile(r'Bat(man|mobile|copter|bat)')
问号实现可选匹配(0,1)
re.compile(r'Bat(wo)?man')
(wo)?部分表明,模式wo是可选的分组。该正则表达式匹配的文本中,wo将出现零次或一次。
星号匹配零次或多次(0,n)
re.compile(r'Bat(wo)*man')
对于'Batwowowowoman',(wo)*匹配wo的4个实例。
加号匹配一次或多次(1,n)
re.compile(r'Bat(wo)+man')
花括号匹配特定次数
正则表达式(Ha){3}将匹配字符串'HaHaHa',但不会匹配'HaHa'。
(Ha){3,5}将匹配'HaHaHa'、'HaHaHaHa'和'HaHaHaHaHa'。 #范围
(Ha){3,}将匹配3次或更多次实例,(Ha){,5}将匹配0到5次实例。
贪心和非贪心匹配
Python的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。 ?表示0或者1次,尽量小
>>> greedyHaRegex = re.compile(r'(Ha){3,5}')
>>> mo1 = greedyHaRegex.search('HaHaHaHaHa')
>>> mo1.group()
'HaHaHaHaHa'
>>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?')
>>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa')
>>> mo2.group()
'HaHaHa'
findall()方法,返回列表
Regex对象也有一个findall()方法。search()将返回一个Match对象,包含被查找字符串中的“第一次”匹配的文本,而findall()方法将返回一组字符串,包含被查找字符串中的所有匹配。
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phoneNumRegex.search('Cell: 415-555-9999 Work: 212-555-00
>>> mo.group()
'415-555-9999'
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # has no groups
>>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
['415-555-9999', '212-555-0000']
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') #has groups
>>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000'
[('415', '555', '9999'), ('212', '555', '0000')]
总结:
作为findall()方法的返回结果的总结,请记住下面两点:
1.如果调用在一个没有分组的正则表达式上,例如\d\d\d-\d\d\d-\d\d\d\d,方法findall()将返回一个匹配字符串的列表,例如['415-555-9999', '212-555-0000']。
2.如果调用在一个有分组的正则表达式上,例如(\d\d\d)-(\d\d\d)-(\d\d\d\d),方法findall()将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[('415', '555', '1122'), ('212', '555', '0000')]。
字符分类
通配字符
.(句点)字符称为“通配符”。它匹配除了换行之外的所有字符。
>>> atRegex = re.compile(r'.at')
>>> atRegex.findall('The cat in the hat sat on the flat mat.')
['cat', 'hat', 'sat', 'lat', 'mat']
点-星匹配所有字符
快速复习
?匹配零次或一次前面的分组。
*匹配零次或多次前面的分组。
+匹配一次或多次前面的分组。
{n}匹配n次前面的分组。
{n,}匹配n次或更多前面的分组。
{,m}匹配零次到m次前面的分组。
{n,m}匹配至少n次、至多m次前面的分组。
{n,m}?或*?或+?对前面的分组进行非贪心匹配。
^spam意味着字符串必须以spam开始。
spam$意味着字符串必须以spam结束。
.匹配所有字符,换行符除外。
\d、\w和\s分别匹配数字、单词和空格。
\D、\W和\S分别匹配出数字、单词和空格外的所有字符。
[abc]匹配方括号内的任意字符(诸如a、b或c)。
[^abc]匹配不在方括号内的任意字符。
不区分大小写的匹配 re.I
>>> robocop = re.compile(r'robocop', re.I)
>>> robocop.search('RoboCop is part man, part machine, all cop.').group()
'RoboCop'
>>> 'RoboCop'
管理复杂的正则表达式
如果要匹配的文本模式很简单,正则表达式就很好。但匹配复杂的文本模式,可能需要长的、费解的正则表达式。你可以告诉re.compile(),忽略正则表达式字符串中的空白符和注释,从而缓解这一点。要实现这种详细模式,可以向re.compile()传入变量re.VERBOSE,作为第二个参数。
使用re.VERBOSE来编写注释,还希望使用re.IGNORECASE来忽略大小写。
someRegexValue = re.compile('foo', re.IGNORECASE | re.DOTALL)
项目:电话号码和E-mail地址提取程序 思路:
1、从剪贴板取得文本。
2、找出文本中所有的电话号码和E-mail地址。
3、将它们粘贴到剪贴板。
现在你可以开始思考,如何用代码来完成工作。代码需要做下面的事情:
1、使用pyperclip模块复制和粘贴字符串。
2、创建两个正则表达式,一个匹配电话号码,另一个匹配E-mail地址。
3、对两个正则表达式,找到所有的匹配,而不只是第一次匹配。
4、将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。
5、如果文本中没有找到匹配,显示某种消息。
第8章 读写文件
Windows中,根文件夹名为C:\,也称为C:盘。在OS X和Linux中,根文件夹是/。
#不同平台看路径
>>> import os
>>> os.path.join('usr', 'bin', 'spam')
'usr\\bin\\spam' #转义
构造文件夹路径
import os
myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
for filename in myFiles:
print(os.path.join('C:\\Users\\asweigart', filename))
#利用os.getcwd()函数,可以取得当前工作路径的字符串,并可以利用os.chdir()改变它。
print('当前路径:'+os.getcwd())
os.chdir('C:\\Windows\\System32')
print('当前路径:'+os.getcwd())
Python中,读写文件有3个步骤:
1.调用open()函数,返回一个File对象。
2.调用File对象的read()或write()方法。
3.调用File对象的close()方法,关闭该文件。
第9章 组织文件
shutil(或称为shell工具)模块中包含一些函数,让你在Python程序中复制、移动、改名和删除文件。要使用shutil的函数,首先需要import shutil。
第10章 调试
程序员之间流传着一个老笑话:“编码占了编程工作量的90%,调试占了另外90%。”
使用日志模块
要启用logging模块,在程序运行时将日志信息显示在屏幕上,请将下面的代码复制到程序顶部(但在Python的#!行之下):
第11章 从Web抓取信息
第12章 处理Excel电子表格用python读写excel的强大工具:openpyxl - _小苹果 - 博客园www.cnblogs.com
openpyxl中,主要用到三个概念:Workbooks,Sheets,Cells。Workbook就是一个excel工作表;Sheet是工作表中的一张表页;Cell就是简单的一个格。openpyxl就是围绕着这三个概念进行的,不管读写都是“三板斧”:打开Workbook,定位Sheet,操作Cell。
快速复习,下面是从电子表格文件中读取单元格涉及的所有函数、方法和数据类型。
1.导入openpyxl模块。
2.调用openpyxl.load_workbook()函数。
3.取得Workbook对象。
4.调用get_active_sheet()或get_sheet_by_name()工作簿方法。
5.取得Worksheet对象。
6.使用索引或工作表的cell()方法,带上row和column关键字参数。
7.取得Cell对象。
8.读取Cell对象的value属性。
第13章 处理PDF和Word文档
PDF文档
Word文档
…………用到再说
第14章 处理CSV文件和JSON数据
CSV表示“Comma-Separated Values(逗号分隔的值)”,CSV文件是简化的电子表格,保存为纯文本文件。Python的csv模块让解析CSV文件变得容易。
JSON(发音为“JAY-sawn”或“Jason”,但如何发音并不重要。因为无论如何发音,都会有人说你发音错误)是一种格式,它以JavaScript源代码的形式,将信息保存在纯文本文件中。
csv模块读取CSV文件,首先用open()函数打开它,就像打开任何其他文本文件一样。但是,不用
在open()返回的File对象上调用read()或readlines()方法,而是将它传递给csv.reader()函数。
这将返回一个Reader对象,供你使用。请注意,不能直接将文件名字符串传递给csv.reader()函数。
json
流行的网站,都提供json API让程序使用。有些网站需要注册,这几乎都是免费的。你必须找到文档,了解程序需要请求什么 URL 才能获得想要的数据,以及返回的JSON数据结构的一般格式。这些文档应在提供API的网站上提供,如果它们有“开发者”页面,就去那里找找。
第15章 保持时间、计划任务和启动程序
程序可以每小时抓取一个网站,检查变更,或在凌晨4点你睡觉时,执行CPU密集型任务。Python的time和datetime模块提供了这些函数。
内置的time模块让Python程序能读取系统时钟的当前时间。在time模块中,time.time()和time.sleep()函数是最有用的模块。
Python内置的round()函数将它们缩短,该函数按照指定的精度四舍五入到一个浮点数。
>>> import time
>>> now = time.time()
>>> now
1533267951.3129227 #1970年1月1日0点,即协调世界时(UTC)。time.time()函数返回自那一刻以来的
秒数
>>> round(now, 2)
1533267951.31
>>> round(now)
1533267951
代码块开始时调用time.time(),并在结束时再次调用,就可以用第二个时间戳减去第一个,得到这两次调用之间经过的时间。
datetime模块
如果以更方便的格式显示日期,或对日期进行算术运算(例如,搞清楚205天前是什么日期,或123天后是什么日期),就应该使用datetime模块。
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 8, 3, 11, 50, 14, 958002)
>>> dt = datetime.datetime(2015, 10, 21, 16, 29, 0)
>>> dt.year, dt.month, dt.day
(2015, 10, 21)
>>> dt.hour, dt.minute, dt.second
(16, 29, 0)
多进程:
import threading, time
print('Start of program.')
def takeANap():
time.sleep(5)
print('Wake up!')
threadObj = threading.Thread(target=takeANap) #生儿子了
threadObj.start()
print('End of program.')
'''
Start of program.
End of program.
Wake up!
'''
为了避免并发问题,绝不让多个线程读取或写入相同的变量。当创建一个新的Thread对象时,要确保其目标函数只使用该函数中的局部变量。这将避免程序中难以调试的并发问题。
后面感觉不用学了,一般用不到,用时再说
附录
PyPI或Python包索引,就像是Python模块的免费应用程序商店。
运行你的Python程序,可以创建一个.BAT批处理文件,用py.exe来运行Python程序。
@py.exe C:\path\to\your\pythonScript.py %*
@pause