讀書:Python編程快速上手——讓繁瑣工作自動化2
來自專欄 3個月python學習筆記
第二部分:自動化任務
第7章 模式匹配與正則表達式
字元串操作技巧
for i in range(len(message)): chunk = message[i:i+12] #i及以後12個 if isPhoneNumber(chunk): #判斷函數 pass
1、創建正則表達式對象
import rephoneNumRegex = re.compile(rddd-ddd-dddd) #返回正則對象
2、匹配Regex對象
mo = phoneNumRegex.search(My number is 415-555-4242.)
3、調用Match對象的group()方法,返回實際匹配文本的字元串。
print(Phone number found: + mo.group())
匹配括弧轉義
re.compile(r((ddd))
匹配多個
re.compile(rBat(man|mobile|copter|bat))
問號實現可選匹配(0,1)
re.compile(rBat(wo)?man)
(wo)?部分表明,模式wo是可選的分組。該正則表達式匹配的文本中,wo將出現零次或一次。
星號匹配零次或多次(0,n)
re.compile(rBat(wo)*man)
對於Batwowowowoman,(wo)*匹配wo的4個實例。
加號匹配一次或多次(1,n)
re.compile(rBat(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(rddd-ddd-dddd)>>> mo = phoneNumRegex.search(Cell: 415-555-9999 Work: 212-555-00>>> mo.group()415-555-9999>>> phoneNumRegex = re.compile(rddd-ddd-dddd) # has no groups>>> phoneNumRegex.findall(Cell: 415-555-9999 Work: 212-555-0000)[415-555-9999, 212-555-0000]>>> phoneNumRegex = re.compile(r(ddd)-(ddd)-(dddd)) #has groups>>> phoneNumRegex.findall(Cell: 415-555-9999 Work: 212-555-0000[(415, 555, 9999), (212, 555, 0000)]
總結:
作為findall()方法的返回結果的總結,請記住下面兩點:
1.如果調用在一個沒有分組的正則表達式上,例如ddd-ddd-dddd,方法findall()將返回一個匹配字元串的列表,例如[415-555-9999, 212-555-0000]。
2.如果調用在一個有分組的正則表達式上,例如(ddd)-(ddd)-(dddd),方法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(rrobocop, 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 osmyFiles = [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
用python讀寫excel的強大工具:openpyxl - _小蘋果 - 博客園用python讀寫excel的強大工具:openpyxl
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()>>> now1533267951.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, timeprint(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 oyourpythonScript.py %*@pause
推薦閱讀:
※編程,在這一刻溫暖人心!!!
※2018-6-29 計算機基礎
※怒刷 LeetCode 100 道 (46)
※python3零基礎快速通關
※業餘愛好者如何學習編程