在之前找工作过程中, 面试时经常被问到会不会 python, 懂不懂正则表达式. 心里想: 软件的东西和芯片设计有什么关系? 咱也不知道因为啥用这个, 咱也不敢问啊! 在网上搜索到了一篇关于脚本在 ASIC 领域中应用的文章 (原文见参考文献 1), 里边提到了 python 的用武之地:
image
本文以《Python 编程快速上手 -- 让繁琐工作自动化》书中的示例, 讲述利用 python 实现文本中特定内容提取的方式.
二, 提取特定内容示例
需求: 找出文本中所有的电话号码和邮件地址. 设计方案: 在剪贴板的文本中提取出所有与电话号码和邮件地址格式匹配的字符串. 有了需求和设计方案, 现根据电话号码和邮箱地址格式编写正则表达式. 先来看看程序代码, 再做讲解.
- import pyperclip,re
- #phoneNumber:415-555-4242 x331
- #email address:info@nostarch.com
- phoneRegex = re.compile(r'''( #0 all
- (\d{3}|\(\d{3}\))? #1 area code
- (\s|-|\.)? #2 separator
- (\d{3}) #3 first 3 digits
- (\s|-|\.) #4 separator
- (\d{4}) #5 last 4 digits
- (\s*(ext|x|ext\.)\s*(\d{2,5}))? #6 7 8extension
- )''',re.VERBOSE)
- emailRegex = re.compile(r'''( #0 all
- [a-zA-Z0-9._% -]+ # username
- @ # @ symbol
- [a-zA-Z0-9.-]+ # domain name
- (\.[a-zA-Z]{2,4}) #1 dot-something
- )''',re.VERBOSE)
- #Find matches in clipboard text.
- text = str(pyperclip.paste())
- mo1 = phoneRegex.findall(text)
- mo2 = emailRegex.findall(text)
- print(mo1)
- print(mo2)
- matches = []
- for groups in phoneRegex.findall(text):
- phoneNum = '-'.join([groups[1],groups[3],groups[5]])
- if groups[8] != '':
- phoneNum += 'x' + groups[8]
- matches.append(phoneNum)
- for groups in emailRegex.findall(text):
- matches.append(groups[0])
- #Copy results to the clipboard
- if len(matches)> 0:
- pyperclip.copy('\n'.join(matches))
- print('Copied to clipboard:')
- print('\n'.join(matches))
- else:
- 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
来源: http://www.jianshu.com/p/3048ed125192