- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
7.1 不用正则表达式来查找文本模式
假设你希望在字符串中查找电话号码。你知道模式:3个数字,一个短横线,3个数字,一个短横线,再是4个数字。例如:415-555-4242。
假定我们用一个名为isPhoneNumber()的函数,来检查字符串是否匹配模式,它返回True或False。打开一个新的文件编辑器窗口,输入以下代码,然后保存为isPhoneNumber.py:
def isPhoneNumber(text): ❶ if len(text) != 12: return False for i in range(0, 3): ❷ if not text[i].isdecimal(): return False ❸ if text[3] != '-': return False for i in range(4, 7): ❹ if not text[i].isdecimal(): return False ❺ if text[7] != '-': return False for i in range(8, 12): ❻ if not text[i].isdecimal(): return False ❼ return True print('415-555-4242 is a phone number:') print(isPhoneNumber('415-555-4242')) print('Moshi moshi is a phone number:') print(isPhoneNumber('Moshi moshi'))
运行该程序,输出看起来像这样:
415-555-4242 is a phone number: True Moshi moshi is a phone number: False
isPhoneNumber()函数的代码进行几项检查,看看text中的字符串是不是有效的电话号码。如果其中任意一项检查失败,函数就返回False。代码首先检查该字符串是否刚好有12个字符❶。然后它检查区号(就是text中的前3个字符)是否只包含数字❷。函数剩下的部分检查该字符串是否符合电话号码的模式:号码必须在区号后出现第一个短横线❸,3个数字❹,然后是另一个短横线❺,最后是4个数字❻。如果程序执行通过了所有的检查,它就返回True❼。
用参数'415-555-4242'调用isPhoneNumber()将返回真。用参数'Moshi moshi'调用isPhoneNumber()将返回假,第一项测试失败了,因为不是12个字符。
必须添加更多代码,才能在更长的字符串中寻找这种文本模式。用下面的代码,替代isPhoneNumber.py中最后4个print()函数调用:
message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.' for i in range(len(message)): ❶ chunk = message[i:i+12] ❷ if isPhoneNumber(chunk): print('Phone number found: ' + chunk) print('Done')
该程序运行时,输出看起来像这样:
Phone number found: 415-555-1011 Phone number found: 415-555-9999 Done
在for循环的每一次迭代中,取自message的一段新的12个字符被赋给变量chunk❶。例如,在第一次迭代,i是0,chunk被赋值为message[0:12](即字符串'Call me at 4')。在下一次迭代,i是1,chunk被赋值为message[1:13](字符串'all me at 41')。
将chunk传递给isPhoneNumber(),看看它是否符合电话号码的模式❷。如果符合,就打印出这段文本。
继续遍历message,最终chunk中的12个字符会是一个电话号码。该循环遍历了整个字符串,测试了每一段12个字符,打印出所有满足isPhoneNumber()的chunk。当我们遍历完message,就打印出Done。
在这个例子中,虽然message中的字符串很短,但它也可能包含上百万个字符,程序运行仍然不需要一秒钟。使用正则表达式查找电话号码的类似程序,运行也不会超过一秒钟,但用正则表达式编写这类程序会快得多。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论