標籤:htm 後退 account else diy ber app rip int
題目:
假設你有一個無聊的任務,要在一篇長的網頁或文章中,找出所有電話號碼和郵件地址。如果手動翻頁,可能需要尋找很長時間。如果有一個程式,可以在剪貼簿的文本中尋找電話號碼和 E-mail 地址,那你就只要按一下 Ctrl-A 選擇所有文本,按下 Ctrl-C 將它複製到剪貼簿,然後運行你的程式。它會用找到的電話號碼和 E-mail地址,替換掉剪貼簿中的文本。
測試文本
Skip to main contentHomeSearch formSearchGO!TopicsArduinoArt & DesignGeneral ComputingHacking & Computer SecurityHardware / DIYJavaScriptKidsLEGO?LEGO? MINDSTORMS?Linux & BSDSkip to main contentHomeSearch formSearchGO!CatalogMediaWrite for UsAbout UsTopicsArduinoArt & DesignGeneral ComputingHacking & Computer SecurityHardware / DIYJavaScriptKidsLEGO?LEGO? MINDSTORMS?Linux & BSDMangaMinecraftProgrammingPythonScience & MathScratchSystem AdministrationEarly AccessGift CertificatesFree ebook edition with every print book purchased from nostarch.com!Shopping cart3 Items Total: $53.48View cart CheckoutContact UsNo Starch Press, Inc.245 8th StreetSan Francisco, CA 94103 USAPhone: 800.420.7240 or +1 415.863.9900 (9 a.m. to 5 p.m., M-F, PST)Fax: +1 415.863.9950Reach Us by EmailGeneral inquiries: [email protected]Media requests: [email protected]Academic requests: [email protected] (Please see this page for academic review requests)Help with your order: [email protected]Reach Us on Social MediaTwitterFacebookNavigationMy accountLog outManage your subscription preferences.About Us | ★ Jobs! ★ | Sales and Distribution | Rights | Media | Academic Requests | Conferences | Order FAQ | Contact Us | Write for Us | PrivacyCopyright 2018 No Starch Press, Inc
運行後結果
Copied to clipboard:800-420-7240415-863-9900415-863-9950 [email protected][email protected][email protected][email protected]Hit any key to close this window...
思路
當你開始接手一個新項目時,很容易想要直接開始寫代碼。但更多的時候,最好是後退一步,考慮更大的圖景。我建議先草擬高層次的計劃,弄清楚程式需要做什麼。暫時不要思考真正的代碼,稍後再來考慮。
1.建立電話的Regex和建立email的Regex
2.匹配剪下板的文本
3.把處理好的文本複製到剪下板
現在開始寫程式
#! python3# phoneAndEmail.py - Finds phone numbers and email addresses on the clipboard.import re, pyperclip# 建立電話的RegexphoneRegex = re.compile(r'''( (\d{3}|\(d{3}\))? # 區號可選,444或(444) (\s|-|\.)? # 分隔字元:字元或-或. 可選 (\d{3}) # 三個數字 (\s|-|\.)? # 分隔字元:字元或-或. 可選 (\d{4}) # 四個數字 )''',re.VERBOSE)# 建立email的RegexemailRegex = re.compile(r'''( [a-zA-Z0-9._%+-]+ # username @ [a-zA-Z0-9.-]+ # domail name (\.[a-zA-Z]{2,4}) # dot-something )''',re.VERBOSE)# 匹配剪下板的文本text = str(pyperclip.paste())matches = []for groups in phoneRegex.findall(text): phoneNum = '-'.join([groups[1], groups[3], groups[6]]) matches.append(phoneNum)for groups in emailRegex.findall(text): 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.')
分析代碼
re.VERBOSE是讓Regex中可以忽略注釋和空白符的一個參數。verbose表示冗雜的意思,就是可以讓你添些注釋,對正則更可讀。
Regex詳見:Python正則
另一個坑就是groups了,原來我沒有理解groups與group的區別
group()是截取分組的意思,例子:
import rea = "123abc456"print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整體print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abcprint re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
groups() 返回一個包含所有小組字串的元組,從 1 到 所含的小組號。
代碼中phoneNum = ‘-‘.join([groups[1], groups[3], groups[6]])中的groups是一個變數,別看錯了。
Python實踐練習:電話號碼和 E-mail 地址提取程式