适用于初学者学习的Python正则表达式

“代码胜于雄辩 。”
——林纳斯·托瓦兹(Linus Torvalds)
许多编程语言和操作系统都支持正则表达式(regular expression):定义搜索模式的一组字符串 。正则表达式可用于检索文件或其他数据中是否存在指定的复杂模式 。例如,可使用正则表达式匹配文件中所有的数字 。本章将学习如何定义正则表达式,将其传入类UNIX操作系统以用来检索文件的grep命令 。该命令会返回文件中与指定模式匹配的文本 。我们还将学习在Python中使用正则表达式检索字符串 。
17.1 初始配置开始之前,先创建一个名为zen.txt的文件 。在命令行中(确保位于zen.txt所在的目录)输入命令python3 -c "import this",这会打印出蒂姆·皮特斯(Tim Peters)写的诗The Zen of Python(Python之禅):
Python之禅


优美胜于丑陋
明了胜于晦涩
简洁胜于复杂
复杂胜于凌乱
扁平胜于嵌套
间隔胜于紧凑
可读性很重要
即便假借特例的实用性之名,也不可违背这些规则
不要包容所有错误,除非你确定需要这样做
当存在多种可能,不要尝试去猜测
而是尽量找一种,最好是唯一一种明显的解决方案
虽然这并不容易,因为你不是Python之父
做也许好过不做,但不假思索就动手还不如不做
如果你无法向人描述你的方案,那肯定不是一个好方案
命名空间是一种绝妙的理念,我们应当多加利用
旗标-c告诉Python传入的字符串中包含有Python代码 。然后Python会执行传入的代码 。Python执行import this之后,将打印The Zen of Python(像上述这首诗一样隐藏在代码中的信息,也被称为彩蛋) 。在Bash中输入exit()函数退出Python,然后将诗的内容复制到文件zen.txt中 。
在Ubuntu系统中,grep命令默认在输出时以红色字体打印匹配的文本,但是在UNIX系统中则不是这么做的 。如果使用的是mac,可以通过在Bash中修改如下环境变量来改变该行为:
# http://tinyurl.com/z9prphe$ export GREP_OPTIONS='--color=always'$ export GREP_OPTIONS='--color=always'要记住,在Bash中直接设置环境变量的方式是不持久的,如果退出Bash,下次再打开时必须重新设置环境变量 。因此,可将环境变量添加至.profile文件,使其持久存在 。
17.2 简单匹配grep命令接受两个参数:一个正则表达式和检索正则表达式中定义模式的文件路径 。使用正则表达式进行最简单的模式匹配,就是简单匹配,即一个字符串匹配单词中相同的字符串 。举个例子,在zen.txt文件所在的目录输入如下命令:
# http://tinyurl.com/jgh3x4c$ grep Beautiful zen.txt>> Beautiful is better than ugly.上例中执行的命令里,第一个参数Beautiful是一个正则表达式,第二个参数zen.txt是检索正则表达式的文件 。Bash打印了Beautiful is better than ugly.这句话,其中Beautiful为红色,因为它是正则表达式匹配上的单词 。
如果将上例中的正则表达式从Beautiful修改为beautiful,grep将无法匹配成功:
# http://tinyurl.com/j2z6t2r$ grep beautiful zen.txt当然,可以加上旗标-i来忽略大小写:
# http://tinyurl.com/zchmrdq$ grep -i beautiful zen.txt>> Beautiful is better than ugly.grep命令默认打印匹配文本所在的整行内容 。可以添加旗标-o,确保只打印与传入的模式参数相匹配的文本:
# http://tinyurl.com/zfcdnmx$ grep -o Beautiful zen.txt>> Beautiful也可通过内置模块re在Python中使用正则表达式 。re模块提供了一个叫findall的方法,将正则表达式和目标文本作为参数传入,该方法将以列表形式返回文本中与正则表达式匹配的所有元素:
01# http://tinyurl.com/z9q2286020304<strong>import</strong> re050607l = "Beautiful is better than ugly."080910matches = re.findall("Beautiful", l)111213print(matches)>> ['Beautiful']本例中findall方法只找到了一处匹配,返回了一个包含匹配结果[Beautiful]的列表 。
将re.IGNORECASE作为第3个参数传入findall,可以让其忽略大小写:
01# http://tinyurl.com/jzeonne020304<strong>import</strong> re050607l = "Beautiful is better than ugly."080910matches = re.findall("beautiful", 11l, 12re.IGNORECASE)131415print(matches)>> ['Beautiful']17.3 匹配起始位置我们还可以在正则表达式中加入特殊字符来匹配复杂模式,特殊字符并不匹配单个字符,而是定义一条规则 。例如,可使用补字符号 ^ 创建一个正则表达式,表示只有模式位于行的起始位置时才匹配成功:


推荐阅读