python中正則表示式與模式匹配
在之前找工作過程中,面試時經常被問到會不會python,懂不懂正則表示式。心裡想:軟體的東西和晶片設計有什麼關係? 咱也不知道因為啥用這個,咱也不敢問啊! 在網上搜索到了一篇關於指令碼在ASIC領域中應用的文章(原文見參考文獻1),裡邊提到了python的用武之地:
image
本文以《Python程式設計快速上手——讓繁瑣工作自動化》書中的示例,講述利用python實現文字中特定內容提取的方式。
二、提取特定內容示例
需求:找出文字中所有的電話號碼和郵件地址。設計方案:在剪貼簿的文字中提取出所有與電話號碼和郵件地址格式匹配的字串。有了需求和設計方案,現根據電話號碼和郵箱地址格式編寫正則表示式。先來看看程式程式碼,再做講解。
1 import pyperclip,re 2 3 #phoneNumber:415-555-4242 x331 4 #email address:[email protected] 5 6 phoneRegex = re.compile(r'''( #0 all 7 (\d{3}|\(\d{3}\))? #1 area code 8 (\s|-|\.)? #2 separator 9 (\d{3}) #3 first 3 digits 10 (\s|-|\.) #4 separator 11 (\d{4}) #5 last 4 digits 12 (\s*(ext|x|ext\.)\s*(\d{2,5}))? #6 7 8extension 13 )''',re.VERBOSE) 14 15 emailRegex = re.compile(r'''( #0 all 16 [a-zA-Z0-9._%+-]+ # username 17 @ # @ symbol 18 [a-zA-Z0-9.-]+ # domain name 19 (\.[a-zA-Z]{2,4}) #1 dot-something 20 )''',re.VERBOSE) 21 22 #Find matches in clipboard text. 23 text = str(pyperclip.paste()) 24 mo1 = phoneRegex.findall(text) 25 mo2 = emailRegex.findall(text) 26 print(mo1) 27 print(mo2) 28 matches = [] 29 for groups in phoneRegex.findall(text): 30 phoneNum = '-'.join([groups[1],groups[3],groups[5]]) 31 if groups[8] != '': 32 phoneNum += ' x' + groups[8] 33 matches.append(phoneNum) 34 35 for groups in emailRegex.findall(text): 36 matches.append(groups[0]) 37 38 #Copy results to the clipboard 39 if len(matches) > 0: 40 pyperclip.copy('\n'.join(matches)) 41 print('Copied to clipboard:') 42 print('\n'.join(matches)) 43 else: 44 print('No phone numbers or email address found.')
此處電話號碼的格式是:三個數字組成的區號(可選),三個數字,四個數字,任意數空格+ext/x/ext.+任意數空格+2到5個數字組成的分機號(可選)。每個部分間以“-”號連線。郵箱地址格式:由字母、數字以及_%+-符號組成的使用者名稱,@符號以及.後的域名,域名由2-4個字母和數字集合組成。根據上述模式可編寫對應的正則表示式。
python的模式匹配有一個簡單固定的套路,import匯入re包,regex = re.compile('''<正則表示式>''')。<模式匹配的內容列表> = regex.findall(<待搜尋字串>)。三步搞定。編寫正則表示式時,在字串前加r防止字元轉義。將各個部分分組並換行以提高程式碼的可讀性,此時需要將re.VERBOSE作為re.compile()函式的第二個引數傳入來忽略表示式中的空白和換行。
三、執行結果
複製程式碼首部註釋掉的文字,然後執行程式。結果如下:
image
前兩行打印出了匹配內容的列表,之後以自定義的統一格式列印欲搜尋的內容。程式執行結果正確。本文以一個小例子測試了python正則表示式提取文字特定內容的功能,之後想嘗試利用python自動生成verilogHDL中module的例化模板。
Python學習交流群:556370268,這裡有資源共享,技術解答,還有小編從最基礎的Python資料到專案實戰的學習資料都有整理,希望能幫助你更瞭解python,學習python。
image