本节书摘来自异步社区《Python核心编程(第3版)》一书中的第1章,第1.1节,作者[美] Wesley Chun(卫斯理 春),孙波翔 李斌 李晗 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
本章内容:
简介/动机;
特殊符号和字符;
正则表达式和Python语言;
一些正则表达式示例;
更长的正则表达式示例。
操作文本或者数据可是件大事。如果不相信,就仔细看看当今的计算机都在做些什么工作:文字处理、网页表单的填写、来自数据库转储的信息流、股票报价信息、新闻源,而且这个清单还会不断增长。因为我们可能还不知道需要用计算机编程来处理的文本或数据的具体内容,所以能将这些文本或者数据以某种可被计算机识别和处理的模式表达出来是非常有用的。
如果我在运营一个电子邮件存档公司,而作为我的一位客户,你希望查看你自己在去年2月份发送和接收的所有电子邮件。如果我能够设计一个计算机程序来收集这些信息,然后转发给你,而不是人工阅读你的邮件然后手动处理你的请求,无疑要好很多。因为如果有人看了你的邮件,哪怕只是用眼睛瞄了一下邮件的时间戳,你可能都会对此感到担心(甚至愤怒)。又比如,你可能会认为凡是带有“ILOVEYOU”这样主题的邮件都是已感染病毒的邮件,并要求从你的个人邮箱中删除它们。这就引出了一个问题,即我们如何通过编程使计算机具有在文本中检索某种模式的能力。
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。简单地说,正则表达式(简称为regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串(见图1-1)。换句话说,它们能够匹配多个字符串……一种只能匹配一个字符串的正则表达式模式是很乏味并且毫无作用的,不是吗?
Python通过标准库中的re模块来支持正则表达式。本节将做一个简短扼要的介绍。限于篇幅,内容将仅涉及Python编程中正则表达式方面的最常见内容。当然,读者对于正则表达式方面的经验(熟悉程度)肯定不同,我们强烈建议阅读一些官方帮助文档和与此主题相关的文档。你将再次会对字符串的理解方式有所改变!
你的第一个正则表达式
前面讲到,正则表达式是包含文本和特殊字符的字符串,该字符串描述一个可以识别各种字符串的模式。我们还简单阐述了正则表达式字母表。对于通用文本,用于正则表达式的字母表是所有大小写字母及数字的集合。可能也存在一些特殊字母;例如,指仅包含字符“0”和“1”的字母表。该字母表可以表示所有二进制字符串的集合,即“0”、“1”、“00”、“01”、“10”、“11”、“100”等。
现在,让我们看看正则表达式的大部分基本内容,虽然正则表达式通常被视为“高级主题”,但是它们其实也非常简单。把标准字母表用于通用文本,我们展示了一些简单的正则表达式以及这些模式所表述的字符串。下面所介绍的正则表达式都是最基本、最普通的。它们仅仅用一个简单的字符串构造成一个匹配字符串的模式:该字符串由正则表达式定义。下面所示为几个正则表达式和它们所匹配的字符串。
上面的第一个正则表达式模式是“foo”。该模式没有使用任何特殊符号去匹配其他符号,而只匹配所描述的内容,所以,能够匹配这个模式的只有包含“foo”的字符串。同理,对于字符串“Python”和“abc123”也一样。正则表达式的强大之处在于引入特殊字符来定义字符集、匹配子组和重复模式。正是由于这些特殊符号,使得正则表达式可以匹配字符串集合,而不仅仅只是某单个字符串。