python中正則表達式與模式匹配

1、前言python

  在以前找工做過程當中,面試時常常被問到會不會python,懂不懂正則表達式。內心想:軟件的東西和芯片設計有什麼關係?咱也不知道由於啥用這個,咱也不敢問啊!在網上搜索到了一篇關於腳本在ASIC領域中應用的文章(原文見參考文獻1),裏邊提到了python的用武之地:git

  本文以《Python編程快速上手——讓繁瑣工做自動化》書中的示例,講述利用python實現文本中特定內容提取的方式。面試

 2、提取特定內容示例正則表達式

  需求:找出文本中全部的電話號碼和郵件地址。設計方案:在剪貼板的文本中提取出全部與電話號碼和郵件地址格式匹配的字符串。有了需求和設計方案,現根據電話號碼和郵箱地址格式編寫正則表達式。先來看看程序代碼,再作講解。編程

 1 import pyperclip,re
 2 
 3 #phoneNumber:415-555-4242 x331
 4 #email address:info@nostarch.com
 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.')
PhoneAndEmail.py

  此處電話號碼的格式是:三個數字組成的區號(可選),三個數字,四個數字,任意數空格+ext/x/ext.+任意數空格+2到5個數字組成的分機號(可選)。每一個部分間以「-」號鏈接。郵箱地址格式:由字母、數字以及_%+-符號組成的用戶名,@符號以及.後的域名,域名由2-4個字母和數字集合組成。根據上述模式可編寫對應的正則表達式。app

  python的模式匹配有一個簡單固定的套路,import導入re包,regex = re.compile('''<正則表達式>''')。<模式匹配的內容列表> = regex.findall(<待搜索字符串>)。三步搞定。編寫正則表達式時,在字符串前加r防止字符轉義。將各個部分分組並換行以提升代碼的可讀性,此時須要將re.VERBOSE做爲re.compile()函數的第二個參數傳入來忽略表達式中的空白和換行。dom

 3、運行結果ide

  複製代碼首部註釋掉的文本,而後運行程序。結果以下:函數

  前兩行打印出了匹配內容的列表,以後以自定義的統一格式打印欲搜索的內容。程序運行結果正確。本文以一個小例子測試了python正則表達式提取文本特定內容的功能,以後想嘗試利用python自動生成verilogHDL中module的例化模板。測試

 參考文獻:

1 ExASIC https://mp.weixin.qq.com/s/qhG9f0WTzUruHgzgldEHSQ

相關文章
相關標籤/搜索