yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理

正则表达式

前面十项,仅仅是想尽各种办法,突破各种常见限制,从而可以顺利访问网站,接下来的问题就是如何从一大堆html代码中提取我们需要的内容,主要介绍十分强大的正则表达式。

了解正则表达式

 

正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就很容易了。

 

正则表达式的语法规则

下面是Python中正则表达式的一些匹配规则:

 

 

 

正则表达式相关注解

数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式“ab*”如果用于查找“abbbc”,将找到“abbb”。而如果使用非贪婪的数量词“ab*?”,将找到“a”。我们一般使用非贪婪模式来提取。

反斜杠问题

与大多数编程语言相同,正则表达式里使用“\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符“\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠“\\\\”:前面两个和后面两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\\”表示。同样,匹配一个数字的“\\d”可以写成r”\d”。

Python Re模块

Python自带了re模块,它提供了对正则表达式的支持。主要用到的方法列举如下:

 

介绍这几个方法之前,我们先来介绍一下pattern的概念,pattern可以理解为一个匹配模式,那么我们怎么获得这个匹配模式呢?很简单的,我们需要利用re.compile方法就可以。例如:

 

在参数中我们传入了原生字符串对象,通过compile方法编译生成一个pattern对象,然后我们利用这个对象来进行进一步的匹配。

另外还有另一个参数flags,在这里解释一下这个参数的含义:

参数flag是匹配模式,取值可以利用按位或运算符‘|’表示同时生效,比如re.I | re.M。

可选值有:

 

在刚才所说的另几个方法例如re.match里我们就需要用到这个pattern了,下面我们一一介绍。

 

Re.match(pattern,string[,flags])

这个方法将会从string(我们要匹配的字符串)的开头开始,尝试匹配pattern,一直向后匹配,如果遇到无法匹配的字符,立即返回None,如果匹配未结束已经到达string的末尾,也会返回None。两个结果均表示匹配失败,否则匹配pattern成功,同时匹配终止,不再对string向后匹配。下面我们通过一个例子解释一下:

 

 

运行结果:

 

匹配分析

第一个匹配,pattern正则表达式为‘hello’,我们匹配的目标字符串string也为hello,从头至尾完全匹配,匹配成功。

第二个匹配,string为hello CQC,从string头开始匹配pattern完全可以匹配,pattern匹配结束,同时匹配终止,后面的o CQC不再匹配,返回匹配成功的信息。

第三个匹配,string为helo CQC,从string头开始匹配pattern,发现到‘o’时无法完成匹配,匹配终止,返回None。

第四个匹配,同第二个匹配原理,即使遇到了空格符也不会受影响。

我们还看到最后打印出了result.group(),这个是什么意思呢?下面我们说一下关于match对象的属性和方法。

Match对象是一次匹配的结果,包含了许多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。

 

 

下面我们用一个例子来体会一下

 

 

Re.search(pattern,string[,flags])

Search方法与match方法极其类似,区别在于match()函数只检测re是不是在string的开始位置匹配,search()会扫描整个string查找匹配,match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就会返回None。同样,search方法的返回对象同样match()返回对象的方法和属性。我们用一个例子感受一下:

 

Re.split(pattern,string[,maxsplit])

按照能够匹配的子串将string分割后返回列表。Maxsplit用于指定最大分割次数,不指定将全部分割。我们通过下面的例子感受一下。

 

Re.findall(pattern,string[,flags])

搜索string,以列表形式返回全部能匹配的子串。我们通过这个例子来感受一下。

 

Re.finditer(pattern,string[,flags])

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。我们通过下面的例子来感受一下:

 

Re.sub(pattern,repl,string[,count])

使用repl替换string中每一个匹配的子串后返回替换的字符串。当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0.当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。Count用于指定最多替换次数,不指定时全部替换。

 

Re.subn(pattern,repl,string[,count])

返回(sub(repl,string[,count]),替换次数)。

 

Python Re模块的另一种使用方式

在上面我们介绍了7个工具方法,例如match,search等等,不过调用方式都是re.match,re.search的方式,其实还有另外一种调用方式,可以通过pattern.match,pattern.search调用,这样调用便不用将pattern作为第一个参数传入了,大家想怎样调用皆可。

函数API列表

 

posted on 2016-01-29 16:53  xxxxxxxx1x2xxxxxxx  阅读(285)  评论(0编辑  收藏  举报