正则表达式与Python
在了解了正则表达式的相关知识之后,开始查看Python当前如何通过使用re模块来支持正则表达式,re模块在很早之前就引入了,用于替换那些已过时的regex模块和regsub模块——这两个模块在Python2.5版中移除,而且此后导入这两个模块中的任意一个都会出发ImportError异常。
re模块支持更强大而且更通用的Perl风格的正则表达式,该模块允许多个线程共享同一个已经编译的正则表达式对象,也支持命名子组。
使用compile( )函数编译正则表达式
后面我们将要介绍的几乎所有的re模块函数都可以作为regex对象的方法。注意,尽管推荐预编译,但这并不是必须的。如果需要编译,就使用编译过的方法:如果不需要编译,就使用函数。幸运的是,不管使用函数还是方法,它们的名字都是相同的。
对于一些特别的正则表达式编译,可选的标记可能以参数的形式给出,这些标记允许不区分大小写的匹配,使用系统的本地化设置来匹配字母数字,等等。
这些标记也可以作为参数适用于大多数re模块函数。如果想要在方法中使用这些标记,它们必须已经集成到已编译的正则表达式对象之中,或者需要使用直接嵌入到正则比啊倒是本身的(?F)标记,其中F是一个或者多个i(用于re.I/IGNORECASE)、m(用于re.M/MULTILINE)、s(用于re.S/DOTALL)等。如果想要使用多个,就把它们放在一起而不是使用按位或操作,例如,(?im)可以用于同时表示re.IGNORECASE和re.MULTILINE。
匹配对象以及group( )和groups( )方法
当处理正则表达式时,除了正则表达式对象之外,还有另一个对象类型:匹配对象。这些是成功调用match( )或者search( )返回的对象。匹配对象有两个主要的方法:group( )和groups( )。
group( )要么返回整个匹配对象,要么根据要求返回特定子组。groups( )则仅返回一个包含唯一或者全部子组的元组。如果没有子组的要求,那么当group( )仍然返回整个匹配时,groups( )返回一个空元组。
使用match( )方法匹配字符串
match( )方法是将要介绍的第一个re模块函数和正则表达式对象方法。match( )函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回None,匹配对象的group( )方法能够用于显示那个成功的匹配。下面是如何运用match( )方法以及group( )方法的一个实例:
模式“foo”完全匹配字符串“foo”,我们也能够确认m是交互式解释器中匹配对象的示例。
我们再来看一个失败的匹配示例,它返回None:
因为上面的匹配失败,所以m被赋值为None,而且以此方法构建的if没有指明任何操作。对于剩余的示例,如果可以,为了简单起见,将省去if语句块,但在实际操作中,最好不要省去以避免AttributeError异常(None是返回的错误值,该值并没有group( )属性[方法])。
只要模式从字符串的起始部分开始匹配,即使字符串比模式长,匹配也可以成功。例如,模式"foo"将在字符串"food on the table"中找到一个匹配,因为它是从字符串的起始部分进行匹配的。
可以看到,尽管字符串比模式要长,但从字符串的起始部分开始匹配依然会正确。子串"foo"是从那个较长的字符串中抽取出来的匹配部分。