隨筆記錄方便自己和同路人查閱。
#------------------------------------------------我是可恥的分割線-------------------------------------------
假設你有一個無聊的任務,要在一篇長的網頁或文章中,找出所有電話號碼和郵件地址。如果手動翻頁,可能需要查找很長時間。
如果有一個程序,可以在剪貼板的文本中查找電話號碼和 E-mail 地址,那你就只要按一下 Ctrl-A 選擇所有文本,按下 Ctrl-C 將它復
制到剪貼板,然后運行你的程序。它會用找到的電話號碼和 E-mail地址,替換掉剪貼板中的文本。當你開始接手一個新項目時,很容
易想要直接開始寫代碼。但更多的時候,最好是后退一步,考慮更大的圖景。我建議先草擬高層次的計划,弄清楚程序需要做什么。
暫時不要思考真正的代碼,稍后再來考慮。現在,先關注大框架。例如,你的電話號碼和 E-mail 地址提取程序需要完成以下任務:
(1)從剪貼板取得文本。
(2) 找出文本中所有的電話號碼和 E-mail 地址。
(3)將它們粘貼到剪貼板。
(4)現在你可以開始思考,如何用代碼來完成工作。代碼需要做下面的事情:
(5) 使用 pyperclip 模塊復制和粘貼字符串。
(6)創建兩個正則表達式,一個匹配電話號碼,另一個匹配 E-mail 地址。
(7)對兩個正則表達式,找到所有的匹配,而不只是第一次匹配。
(8) 將匹配的字符串整理好格式,放在一個字符串中,用於粘貼。
(9)如果文本中沒有找到匹配,顯示某種消息。
這個列表就像項目的路線圖。在編寫代碼時,可以獨立地關注其中的每一步。每一步都很好管理。它的表達方式讓你知道在 Python
中如何去做。
#------------------------------------------------我是可恥的分割線-------------------------------------------
示例代碼:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import re,pyperclip #定義正則表達式,找出文本中所有的電話號碼。 phoneRegex = re.compile(r'''( #匹配區號,因為區號可能只是三位數字,也可能是括號中三位數字,所以使用?問號和管道匹配分組中的內容一次或零次 (\d{3}|\(\d{3}\))? #匹配電話號碼的連接符,因為區號與號碼之間可能是字母也可能是短橫線或者.點符號,所以把他們分在一個組用管道和問號匹配 (\s|-|\.)? #匹配短橫線后面的三位數字 (\d{3}) #匹配電話號碼的連接符,因為區號與號碼之間可能是字母也可能是短橫線或者.點符號,所以把他們分在一個組用管道和問號匹配 (\s|-|\.) #匹配四個數字 (\d{4}) #匹配分機號 (\s*(ext|x|ext.)\s*(\d{2,5}))? )''', re.VERBOSE) #定義正則表達式,找出文本中所有的E-mail 地址。 emailRegex = re.compile(r'''( #創建自定義字符分類,匹配小寫a到z、大寫A到Z和數字0到9,后面可以有._%+- [a-zA-Z0-9._%+-]+ #自定義字符分類后面是安特符號 @ #自定義字符分類,匹配寫a到z、大寫A到Z和數字0到9,后面可以有.- [a-zA-Z0-9.-]+ #匹配分組,.點后面可以是任意大小寫字母,可以有2到4個 (\.[a-zA-Z]{2,4}) )''',re.VERBOSE) #從剪貼板取得文本。 text = str(pyperclip.paste()) #創建一個空列表,將所有的匹配保存在名為 matches 的列表變量中 matches = [] #循環匹配到的電話號碼 for groups in phoneRegex.findall(text): #把匹配到的電話號碼,區號、前三位數字、后四位數字轉換為字符串,以斷橫杠分割 phoneNum = '-'.join([groups[1],groups[3],groups[5]]) #判斷分機號是否不等於空 if groups[8] != '': #電話號碼中帶有分機號時,在分機號前面加空格和大寫X phoneNum += ' X'+groups[8] #把分機號追加到matches列表中 matches.append(phoneNum) #循環匹配到的email地址 for groups in emailRegex.findall(text): #分組0 匹配整個正則表達式,把email地址追加到matches列表中 matches.append(groups[0]) if len(matches) > 0: # 將匹配的字符串整理好格式,放在一個字符串中,用於粘貼。 pyperclip.copy('\n'.join(matches)) print('Copied to clipboard:') # 打印放入粘貼版的內容。 print('\n'.join(matches)) else: # 如果文本中沒有找到匹配,顯示某種消息。 print('No phone numbers or email addresses found.')
運行結果: