第4章 正则表达式
1、简介正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。 就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。使用这个小型语言,你可以为想要匹配的相应字符串集指定规则;该字符串集可能包含英文语句、e-mail地址、TeX命令或任何你想搞定的东西。然后你可以问诸如“这个字符串匹配该模式吗?”或“在这个字符串中是否有部分匹配该模式呢?”。你也可以使用 RE以各种方式来修改或分割字符串。 使用正则表达式进行匹配的流程: 2、字符匹配2.1普通字符大多数字母和字符一般都会和自身匹配。例如,正则表达式 test 会和字符串“test”完全匹配。(你也可以使用大小写不敏感模式,它还能让这个 RE 匹配“Test”或“TEST”;稍后会有更多解释.) 2.2元字符这里有一个元字符的完整列表: 下面逐一介绍: [ ] 用于指定一个字符的集合。可以单独列出字符,也可以用'-'连接起止字符以表示一个范围。[abc] 将匹配“a”,“b”,或 “c“中的任意一个字符,[a-z]匹配任意一个小写字母,[a-zA-Z0-9]匹配任意一个字母或数字。 元字符在中括号里将失效,比如[akm$]就表示字符'a','k','m',或'$',在这里$也变身为普通字符了。 你还可以对一个字符集合取反,以匹配任意不在这个字符集合里的字符,取反操作用一个“^”放在集合的最前面表示,放在其他地方的“^”将不会起特殊作用。例如[^5]将匹配任意不是“5”的字符;[^^]将匹配任意不是“^”的字符。 ^ 匹配字符串开头,在多行模式中匹配每一行的开头。 $ 匹配一个字符串的结尾或者字符串最后面的换行符,在多行模式下,也匹配每一行的行尾。
反斜杠后面可以加不同的字符以表示不同特殊意义。 预定义字符集: 这些特殊字符都可以包含在一个字符类中。如, 也可以用于取消所有的元字符:[或 * 指定匹配前一个字符0次或多次。 + 指定匹配前一个字符1次或多次。 ? 指定匹配前一个字符0次或1次。 限制匹配的贪婪性:*?、+?、??、{}? { } {m,n}匹配前一个字符m至n次。m和n可以省略:若省略m,则匹配0至n次,若省略n,则匹配m至无限次。 {0,}等同于*,{1,}等同于+,而{0,1}则与?相同。 . 匹配任意除换行符“n”外的字符。在DOTALL模式中也能匹配换行符。 | 代表左右表达式任意匹配一个。 非贪婪的,它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。
3、使用正则表达式re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用它们来进行匹配。 3.1编译正则表达式正则表达式被编译成 “RegexObject”实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。 re.compile()也接受可选的标志参数,常用来实现不同的特殊功能和语法变更,因为compile是re模块方法,形式为:compile(pattern,flags=0)。 3.2反斜杠的麻烦 在早期规定中,正则表达式用反斜杠字符 (“”) 来表示特殊格式或允许使用特殊字符而不调用它的特殊用法。这就与 Python 在字符串中的那些起相同作用的相同字符产生了冲突。 简单地说,为了匹配一个反斜杠,不得不在RE字符串中写 “\”,因为正则表达式中必须是“”,而每个反斜杠在常规的 Python字符串实值中必须表示成“”。在REs中反斜杠的这个重复特性会导致大量重复的反斜杠,而且所生成的字符串也很难懂。 解决的办法就是为正则表达式使用Python的raw字符串表示;在字符串前加个“r”反斜杠就不会被任何特殊方式处理,所以r“n” 就是包含“”和“n”的两个字符,而“n”则是一个字符,表示一个换行。正则表达式通常在Python代码中都是用这种raw字符串表示。 3.3执行匹配(1)RegexObject的方法和属性 一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?“RegexObject”实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Python Library Reference。 如果没有匹配到的话,match()和 search()将返回None。如果成功的话,就会返回一个“MatchObject”实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。 (2)MatchObject的方法和属性 MatchObject 实例也有几个方法和属性;最重要的那些如下所示: 在实际程序中,最常见的作法是将“MatchObject”保存在一个变量里,然后检查它是否为None,通常如下所示: 3.4模块级函数你不一定要产生一个“RegexObject”对象然后再调用它的方法;re模块也提供了顶级函数调用如match()、search()、sub()、subn()、split()、findall()、compile()等等。这些函数使用RE字符串作为第一个参数,而后面的参数则与相应“RegexObject”的方法参数相同,返回则要么是None要么就是一个“MatchObject”的实例。 3.5编译标志(flags)编译标志让你可以修改正则表达式的一些运行方式。
参考文献: 1、Python正则表达式操作指南 2、Python正则表达式 3、Python正则表达式——视频 4、Python正则表达式——深入浅出 5、Python正则表达式指南 6、Python正则表达式学习 7、Python中re模块学习 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |