优秀的程序员Python培训分享python中爬虫常用的正则表达式,正则表达式和爬虫:爬虫的四个主要步骤:?明确目标(知道你要去的范围或要搜索的网站)?Crawl(抓取所有网站的所有内容)?Fetch(去除对我们无用的数据)?Processdata(按照我们想要的方式存储和使用)那么在textfilter中最强大的就是正则表达式,是python爬虫世界不可或缺的工具。什么是正则表达式正则表达式,也称为正则表达式,通常用于检索和替换符合某种模式(规则)的文本。正则表达式是字符串运算的逻辑公式。就是利用预先定义好的一些特定的字符,以及这些特定字符的组合,组成一个“规则串”。这个“规则字符串”是用来表达字符串的过滤逻辑。给定一个正则表达式和另一个字符串,我们可以实现以下目的:?给定的字符串是否满足正则表达式的过滤逻辑(“匹配”);?通过正则表达式,从文本字符串中获取我们想要的特定部分(“过滤器”)。正则表达式匹配规则Python的re模块在Python中,我们可以通过内置的re模块来使用正则表达式。需要特别注意的一点是,正则表达式对特殊字符使用了转义,所以如果我们想使用原始字符串,我们只需要添加一个r前缀:使用re模块的一般步骤如下:?使用compile()函数将正则表达式的字符串形式编译成一个Pattern对象?通过Pattern对象提供的一系列方法对文本进行匹配查找,得到匹配结果,一个Match对象。?最后,使用Match对象提供的属性和方法获取信息,并根据需要进行其他操作。compile函数compile函数用于编译一个正则表达式并生成一个Pattern对象。它的一般用法如下:importre#将正则表达式编译成一个Pattern对象模式匹配和搜索文本的方法。Pattern对象的一些常用方法有:?match方法:从起始位置开始搜索,一次匹配?search方法:从任意位置开始搜索,一次匹配?findall方法:匹配所有,返回列表?finditer方法:匹配所有,返回迭代器?split方法:拆分字符串并返回一个列表?sub方法:替换match方法match方法用于查找字符串的头部(也可以指定起始位置),它是一个匹配,只要asamatchisfound返回结果而不是查找所有匹配结果。它的一般使用形式如下:match(string[,pos[,endpos]])其中string为要匹配的字符串,pos和endpos为可选参数,指定字符串的开始和结束位置,默认值分别是0和len(字符串长度)。因此,当不指定pos和endpos时,match方法默认匹配字符串的头部。匹配时返回Match对象,如果不匹配则返回None。importrepattern=re.compile(r'\d+')#用于匹配至少一个数m=pattern.match('okk12hellohai34fine')#找到头,没有匹配printmNonem=pattern.match('okk12hellohai34fine',2,10)#从位置'k'开始匹配,不匹配printmNonem=pattern.match('okk12hellohai34fine',3,10)#从位置'1'开始匹配,完全匹配printm#返回一个匹配对象<_sre.SRE_Matchobjectat0x10a42aac0>m.group(0)#可以省略0'12'm.start(0)#可以省略03m.end(0)#可以省略05m.span(0)#可以省略0(3,5))上面匹配成功返回一个Match对象,其中:?group([group1,...])方法用于获取一个或多个组匹配字符串。当你想获取整个匹配的子串时,可以直接使用group()或group(0);?start([group])方法用于获取group匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为0;?end([group])方法用于获取group匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为0;?span([group]])方法返回(start(group),end(group))。再看一个例子:importrepattern=re.compile(r'([a-z]+)([a-z]+)',re.I)#re.I表示忽略大小写m=pattern.match('HelloWorldWifeweb')printm#匹配成功,返回一个匹配对象<_sre.SRE_Matchobjectat0x10bea83e8>m.group(0)#返回匹配成功的整个子串'HelloWorld'm.span(0)#返回匹配成功(0,11)的整个子串的索引m.group(1)#返回第一个匹配成功的子串的子串'Hello'm.span(1)#返回匹配成功的子串的索引第一组(0,5)m.group(2)#返回成功匹配第二组'World'的子串m.span(2)#返回成功匹配第二组(6,11)m的子串。groups()#等价于(m.group(1),m.group(2),...)('Hello','World')m.group(3)#没有第三组Traceback(最近的calllast):File"",line1,inIndexError:nosuchgroupsearchmethod使用搜索方法查找字符串的任意位置,也是一个匹配,只要找到一个匹配的结果,就会返回,而不是查找所有匹配的结果,其一般使用形式如下:search(string[,pos[,endpos]])其中string为要匹配的字符串,pos和endpos为可选参数,指定字符串的开始和结束位置,默认值分别为0和len(字符串长度)。匹配时返回Match对象,如果不匹配则返回None。我们来看一个例子:importrepattern=re.compile('\d+')m=pattern.search('okk12hellohai34fine')#这里如果使用match方法,是不会匹配m<_sre.SRE_Matchobjectat0x10cc03ac0>m.group()'12'm=pattern.search('okk12hellohai34fine',10,30)#指定字符串区间m<_sre.SRE_Matchobjectat0x10cc03b28>m.group()'34'm.span()(13,15)再看一个例子:importre#将正则表达式编译成Pattern对象pattern=re.compile(r'\d+')#使用search()查找匹配的子串,如果没有匹配的子串,会返回None#这里使用match()无法成功匹配m=pattern.search('hello123456789')ifm:#使用Match获取组信息print'matchingstring:',m.group()#起始位置andendpositionprint'position:',m.span()Executiveresult:matchingstring:123456position:(6,12)findall方法上面的match和search方法都是匹配,只要找到一个匹配结果,它会被退回。然而,大多数时候,我们需要搜索整个字符串以获得所有匹配结果。findall方法的使用形式如下:findall(string[,pos[,endpos]])其中,string为要匹配的字符串,pos和endpos为可选参数,指定字符串的起止位置,默认值分别是0和len(字符串长度)。findall将所有匹配的子字符串作为列表返回,如果没有匹配则返回空列表。看例子:importrepattern=re.compile(r'\d+')#Findnumbersresult1=pattern.findall('hello123456789')result2=pattern.findall('one1two2three3four4',0,10)printresult1printresult2executeResult:['123456','789']['1','2']finditer方法finditer方法的行为类似于findall。它还搜索整个字符串并获得所有匹配结果。但它返回一个迭代器,该迭代器顺序访问每个匹配结果(Match对象)。split方法split方法根据可以匹配的子字符串拆分字符串并返回一个列表。其用法如下:split(string[,maxsplit])其中maxsplit用于指定最大拆分次数,否则全部拆分。看例子:importrep=re.compile(r'[\s\,\;]+')printp.split('a,b;;cd')执行结果:['a','b','c','d']sub方法sub方法用于替换。它以下列形式使用:sub(repl,string[,count])其中repl可以是一个字符串或一个函数:?如果repl是一个字符串,repl将被用来替换该字符串的每个匹配的子字符串,并返回被替换的字符串。另外,repl也可以用id的形式来引用组,但是不能用数字0;?如果repl是一个函数,该方法应该只接受一个参数(Match对象)并返回一个字符串用于替换(返回的字符串中不能引用组)。?count用于指定最大替换次数,如果不指定,则全部替换。看例子:importrep=re.compile(r'(\w+)(\w+)')#\w=[A-Za-z0-9]s='hello123,hello456'printp.sub(r'helloworld',s)#将'hello123'和'hello456'替换为'helloworld'printp.sub(r'\2\1',s)#引用分组deffunc(m):return'hi'+''+m.group(2)printp.sub(func,s)printp.sub(func,s,1)#最多替换一个执行结果:helloworld,helloworld123hello,456你好123,你好456你好123,你好456
