python中正则表达式与模式匹配
2019-05-08 07:34:05来源:博客园 阅读 ()
一、前言
在之前找工作过程中,面试时经常被问到会不会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
原文链接:https://www.cnblogs.com/moluoqishi/p/10825221.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash