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

本文以《Python編程快速上手——讓繁瑣工作自動化》書中的示例,講述利用python實現文本中特定內容提取的方式。
二、提取特定內容示例
需求:找出文本中所有的電話號碼和郵件地址。設計方案:在剪貼板的文本中提取出所有與電話號碼和郵件地址格式匹配的字符串。有了需求和設計方案,現根據電話號碼和郵箱地址格式編寫正則表達式。先來看看程序代碼,再做講解。
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.')
此處電話號碼的格式是:三個數字組成的區號(可選),三個數字,四個數字,任意數空格+ext/x/ext.+任意數空格+2到5個數字組成的分機號(可選)。每個部分間以“-”號連接。郵箱地址格式:由字母、數字以及_%+-符號組成的用戶名,@符號以及.后的域名,域名由2-4個字母和數字集合組成。根據上述模式可編寫對應的正則表達式。
python的模式匹配有一個簡單固定的套路,import導入re包,regex = re.compile('''<正則表達式>''')。<模式匹配的內容列表> = regex.findall(<待搜索字符串>)。三步搞定。編寫正則表達式時,在字符串前加r防止字符轉義。將各個部分分組並換行以提高代碼的可讀性,此時需要將re.VERBOSE作為re.compile()函數的第二個參數傳入來忽略表達式中的空白和換行。
三、運行結果
復制代碼首部注釋掉的文本,然后運行程序。結果如下:

前兩行打印出了匹配內容的列表,之后以自定義的統一格式打印欲搜索的內容。程序運行結果正確。本文以一個小例子測試了python正則表達式提取文本特定內容的功能,之后想嘗試利用python自動生成verilogHDL中module的例化模板。
參考文獻:
1 ExASIC https://mp.weixin.qq.com/s/qhG9f0WTzUruHgzgldEHSQ
