python编程快速上手怎么样_读书:Python编程快速上手——让繁琐工作自动化2

第二部分:自动化任务

第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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值