- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 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.9 通配字符
在正则表达式中,.(句点)字符称为“通配符”。它匹配除了换行之外的所有字符。例如,在交互式环境中输入以下代码:
>>> atRegex = re.compile(r'.at') >>> atRegex.findall('The cat in the hat sat on the flat mat.') ['cat', 'hat', 'sat', 'lat', 'mat']
要记住,句点字符只匹配一个字符,这就是为什么在前面的例子中,对于文本flat,只匹配lat。要匹配真正的句点,就是用倒斜杠转义:.。
7.9.1 用点-星匹配所有字符
有时候想要匹配所有字符串。例如,假定想要匹配字符串'First Name:',接下来是任意文本,接下来是'Last Name:',然后又是任意文本。可以用点-星(.*)表示“任意文本”。回忆一下,句点字符表示“除换行外所有单个字符”,星号字符表示“前面字符出现零次或多次”。
在交互式环境中输入以下代码:
>>> nameRegex = re.compile(r'First Name: (.*) Last Name: (.*)') >>> mo = nameRegex.search('First Name: Al Last Name: Sweigart') >>> mo.group(1) 'Al' >>> mo.group(2) 'Sweigart'
点-星使用“贪心”模式:它总是匹配尽可能多的文本。要用“非贪心”模式匹配所有文本,就使用点-星和问号。像和大括号一起使用时那样,问号告诉Python用非贪心模式匹配。在交互式环境中输入以下代码,看看贪心模式和非贪心模式的区别:
>>> nongreedyRegex = re.compile(r'<.*?>') >>> mo = nongreedyRegex.search(' for dinner.>') >>> mo.group() '< To serve man>' >>> greedyRegex = re.compile(r'<.*>') >>> mo = greedyRegex.search(' for dinner.>') >>> mo.group() '< To serve man> for dinner.>'
两个正则表达式都可以翻译成“匹配一个左尖括号,接下来是任意字符,接下来是一个右尖括号”。但是字符串'<To serve man> for dinner.>'对右肩括号有两种可能的匹配。在非贪心的正则表达式中,Python匹配最短可能的字符串:'<To serve man>'。在贪心版本中,Python匹配最长可能的字符串:'<To serve man> for dinner.>'。
7.9.2 用句点字符匹配换行
点-星将匹配除换行外的所有字符。通过传入re.DOTALL作为re.compile()的第二个参数,可以让句点字符匹配所有字符,包括换行字符。
在交互式环境中输入以下代码:
>>> noNewlineRegex = re.compile('.*') >>> noNewlineRegex.search('Serve the public trust.\nProtect the innocent. \nUphold the law.').group() 'Serve the public trust.' >>> newlineRegex = re.compile('.*', re.DOTALL) >>> newlineRegex.search('Serve the public trust.\nProtect the innocent. \nUphold the law.').group() 'Serve the public trust.\nProtect the innocent.\nUphold the law.'
正则表达式noNewlineRegex在创建时没有向re.compile()传入re.DOTALL,它将匹配所有字符,直到第一个换行字符。但是,newlineRegex在创建时向re.compile()传入了re.DOTALL,它将匹配所有字符。这就是为什么newlineRegex.search()调用匹配完整的字符串,包括其中的换行字符。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论