您的位置:首页 > 编程语言 > Python开发

比较详细Python正则表达式操作指南(re使用)[2]

2014-04-19 23:02 706 查看

使用正则表达式

现在我们已经看了一些简单的正则表达式,那么我们实际在 Python 中是如何使用它们的呢?
re 模块提供了一个正则表达式引擎的接口,可以让你将 REs 编译成对象并用它们来进行匹配。

编译正则表达式

正则表达式被编译成 `RegexObject` 实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。


#!python




>>> import re




>>> p = re.compile('ab*')




>>> print p




<re.RegexObject
instance at 80b4150>

re.compile() 也接受可选的标志参数,常用来实现不同的特殊功能和语法变更。我们稍後将查看所有可用的设置,但现在只举一个例子:


#!python




>>> p = re.compile('ab*',
re.IGNORECASE)



RE 被做为一个字符串发送给 re.compile()。REs 被处理成字符串是因为正则表达式不是 Python 语言的核心部分,也没有为它创建特定的语法。(应用程序根本就不需要
REs,因此没必要包含它们去使语言说明变得臃肿不堪。)而 re 模块则只是以一个 C 扩展模块的形式来被 Python 包含,就象 socket 或 zlib 模块一样。

将 REs 作为字符串以保证 Python 语言的简洁,但这样带来的一个麻烦就是象下节标题所讲的。

反斜杠的麻烦

在早期规定中,正则表达式用反斜杠字符 (""") 来表示特殊格式或允许使用特殊字符而不调用它的特殊用法。这就与 Python 在字符串中的那些起相同作用的相同字符产生了冲突。

让我们举例说明,你想写一个 RE 以匹配字符串 ""section",可能是在一个 LATEX 文件查找。为了要在程序代码中判断,首先要写出想要匹配的字符串。接下来你需要在所有反斜杠和元字符前加反斜杠来取消其特殊意义。

字符阶段
\section要匹配的字符串
\\section为 re.compile 取消反斜杠的特殊意义
"\\\\section"为字符串取消反斜杠
简单地说,为了匹配一个反斜杠,不得不在 RE 字符串中写 '\\',因为正则表达式中必须是 "\\",而每个反斜杠按 Python 字符串字母表示的常规必须表示成
"\\"。在 REs 中反斜杠的这个重复特性会导致大量重复的反斜杠,而且所生成的字符串也很难懂。

解决的办法就是为正则表达式使用 Python
raw 字符串表示;在字符串前加个 "r" 反斜杠就不会被任何特殊方式处理,所以 r"\n" 就是包含"\" 和 "n" 的两个字符,而 "\n" 则是一个字符,表示一个换行。正则表达式通常在 Python 代码中都是用这种
raw 字符串表示。

常规字符串Raw 字符串
"ab*"r"ab*"
"\\\\section"r"\\section"
"\\w+\\s+\\1"r"\w+\s+\1"

执行匹配

一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?`RegexObject` 实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Python Library
Reference

方法/属性作用
match()决定 RE 是否在字符串刚开始的位置匹配
search()扫描字符串,找到这个 RE 匹配的位置
findall()找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer()找到 RE 匹配的所有子串,并把它们作为一个迭代器返回
如果没有匹配到的话,match() 和 search() 将返回 None。如果成功的话,就会返回一个 `MatchObject` 实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。

你可以用采用人机对话并用 re 模块实验的方式来学习它。如果你有 Tkinter 的话,你也许可以考虑参考一下 Tools/scripts/redemo.py,一个包含在 Python 发行版里的示范程序。

首先,运行 Python 解释器,导入 re 模块并编译一个 RE:


#!python




Python 2.2.2 (#1,
Feb 10 2003, 12:57:01)




>>> import re




>>> p = re.compile('[a-z]+')




>>> p




<_sre.SRE_Pattern
object at 80c3c28>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: