python中正则表达式与模式匹配
一、前言
在之前找工作过程中,面试时经常被问到会不会python,懂不懂正则表达式。心里想:软件的东西和芯片设计有什么关系?咱也不知道因为啥用这个,咱也不敢问啊!在网上搜索到了一篇关于脚本在ASIC领域中应用的文章(原文见参考文献1),里边提到了python的用武之地:
本文以《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.')
PhoneAndEmail.py
此处电话号码的格式是:三个数字组成的区号(可选),三个数字,四个数字,任意数空格+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
最新文章
- shell编程常用的截取字符串操作
- Java Netty 4.x 用户指南
- LNMP环境搭建
- 1.4---字符串空格变成20%(CC150)
- J2EE 第二阶段项目之编写代码(六)
- mysql ALTER COLUMN MODIFY COLUMN CHANGE COLUMN 区别及用法 (转)
- zend+xdebug单步调试
- Android中ProgressDialog的简单示例
- Linux C/C++ 编程练手 --- 大数相加和大数相乘
- HDU 4712Hamming Distance(随机函数运用)
- MegaCli 安装过程
- js 函数 作用域 全局作用域 局部作用域 闭包
- MySQL学习笔记_10_MySQL高级操作(下)
- Excel常用的格式处理
- Python进阶6---序列化与反序列化
- Centos 6.x/7.x yum安装php5.6.X
- 7、 jade 、 ejs、express集成模板
- qt在GUI显示时,将调试信息输出到控制台的设置
- java泛型的作用和好处
- (转)Linux系统-tcpdump常用抓包命令
热门文章
- spoj 839 OPTM - Optimal Marks&;&;bzoj 2400【最小割】
- linux系统 for 大数据
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
- codevs 4228 小猫爬山 【搜索】By cellur925
- 例题3-4 master-mind hints
- CocoaPods 升级出现问题 (一)
- poj 1258 Agri-Net prim模板 prim与dijkstra的区别
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
- 最短路(Dijkstra) HDOJ 4318 Power transmission
- Cenos7 切换单用户模式