播放python爬虫的正则表达式
面对一大堆乱七八糟的混有文字的代码,我们该如何提取和整理呢?我们来介绍一个非常强大的工具,正则表达式!
1.理解正则表达式。
正则表达式是字符串运算的一种逻辑公式,即“正则字符串”是由预先定义的一些特定字符和这些特定字符的组合组成的,而这个“正则字符串”是用来表示对字符串的一种过滤逻辑。
正则表达式是一个非常强大的字符串匹配工具。在其他编程语言中,正则表达式的概念是一样的,Python也不例外。通过正则表达式,我们可以轻松地从返回的页面内容中提取我们想要的内容。
正则表达式的近似匹配过程是:
依次比较表达式和文本中的字符。如果每个字符都可以匹配,则匹配成功。一旦出现不成功的字符,匹配就会失败。如果表达式中有量词或边界,过程会略有不同。2.正则表达式的语法规则。
下面是Python中正则表达式的一些匹配规则,图片来自CSDN。
3.与正则表达式相关的注释。
(1)量词的贪婪模式和非贪婪模式正则表达式通常用于查找文本中的匹配字符串。在Python中,量词默认是贪婪的(或者在少数语言中默认是非贪婪的),并且总是试图匹配尽可能多的字符。相反,那些不贪婪的人总是试图匹配尽可能少的字符。例如,如果使用正则表达式“ab*”来查找“abbbc”,将会找到“abbb”。如果你使用非贪婪量词“ab*?”,“一个”就会被发现。
注意:我们一般采用非贪婪模式进行抽取。
(2)反斜杠的问题和大多数编程语言一样,正则表达式中使用“\”作为转义字符,可能会造成反斜杠麻烦。如果需要匹配文本中的字符“\”,那么在用编程语言表示的正则表达式中就需要四个反斜杠“\ \ \”:前两个和后两个在编程语言中用来转义成反斜杠,然后在转换成两个反斜杠后在正则表达式中转义成反斜杠。
Python中的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以用r“\”来表示。同样,匹配数字的“\\d”可以写成r“\ d”。有了原生字符串,妈妈就不用担心会漏掉反斜杠了,写出来的表达式更直观。
4.Python Re模块。
Python有自己的re模块,为正则表达式提供支持。使用的主要方法如下。
#返回pattern对象re.compile(string[,flag]) #以下是函数re.match (pattern,string[,flags]) re.search (pattern,string [,flags]) re.split (pattern,string [,maxsplit])re.findall(pattern,string [,flags])re.sub(pattern,repl,string[,count])re.subn(pattern,repl,string[,count])在介绍这些方法之前,我们先来介绍一下模式可以理解为匹配模式,那么我们如何得到这种匹配模式呢?很简单,我们需要使用re.compile方法。例如
Pattern=re.compile(r'hello ')我们在参数中传入了本机字符串对象,由编译方法编译生成了一个Pattern对象,然后我们使用这个对象进行进一步的匹配。
此外,您可能已经注意到另一个参数标志。这里,解释一下这个参数的含义:
参数标志是一种匹配模式,其值可以用按位或运算符“|”表示,如re。我| re。M.
可选值有:
Re。I (IGNORECASE):忽略大小写(括号内完整书写,下同)Re。M (MULTILINE):多线模式,改变''和' $ '的行为(见上图)Re。S (DOTALL):任意匹配模式。更改“.”的行为re.l(拼写:LOCALE):使预定的字符类\w \W \b \B \s \S依赖于当前的区域设置re.u(拼写:UNICODE):使预定的字符类\ w \ w \ b \ s \。在这种模式下,正则表达式可以是多行的,空白字符可以忽略,并且可以添加注释。
我们需要在刚才提到的其他几个方法中使用这种模式,比如re.match,我们来逐一介绍一下。
注意:以下七种方法中的标志也意味着匹配模式。如果在模式生成期间已经指示了标志,那么就没有必要在下面的方法中传递这个参数。(1) re。match (pattern,string [,flags])这个方法将从string(我们要匹配的字符串)的开头开始,并尝试一路匹配模式。如果遇到不匹配的字符,会立即返回None,如果匹配没有完成,已经到达字符串末尾,也会返回None。两个结果都表示匹配失败,否则匹配模式成功,匹配同时结束,字符串不再反向匹配。我们举个例子来了解一下。
#-*-coding : utf-8-*-# import re module import re #将正则表达式编译成Pattern对象,注意hello前的r表示“原生字符串”pattern=re.compile(r'hello') #使用re.match匹配文本,得到匹配结果。将不返回任何结果1=re。match(模式,“hello”)result 2=re。匹配(模式,' helloocqc!)结果3=re.match(模式,‘你好,CQC!)结果4=re.match(模式,‘你好,CQC!)#如果1匹配成功,如果result1: #使用match获取分组信息,printresult1.group () else 3360,print' 1匹配失败!#如果2个匹配成功,如果result2: #使用match获取分组信息,printresult2.group () else :打印' 2个匹配失败!#如果3个匹配成功,ifresult: #使用Match获取分组信息,printresult3.group () else 3360,print' 3个匹配失败!#如果4匹配成功,如果result4: #使用match获取分组信息,printresult4.group () else :print' 4匹配失败!运行结果
Hellohello3匹配失败!你好匹配分析。
1.对于第一次匹配,pattern的正则表达式是‘hello’,我们匹配的目标字符串也是hello,从头到尾完全匹配,匹配成功。
2.第二个匹配,字符串是helloo CQC,模式可以从字符串头完全匹配,模式匹配结束,同时匹配结束,后面的o CQC不再匹配,返回匹配成功的信息。
3.第三个匹配,字符串是helo CQC,从字符串的头部匹配模式,当找到“o”时,匹配无法完成,因此匹配结束并返回None。
4.第四种匹配与第二种匹配原则相同,即使遇到空格字符也不会受到影响。
我们还看到result.group()终于打印出来了。这是什么意思?我们来谈谈Match对象的属性和方法。Match对象是一个匹配的结果,包含了很多关于这个匹配的信息。您可以使用Match提供的可读属性或方法来获取此信息。
属性:1.string:匹配时使用的文本。2.2.re:匹配中使用的模式对象。3.正则表达式在3.pos:文本中开始搜索的索引。与值Pattern.match()和Pattern.seach()方法同名的参数相同。4.以4 . end poss :文本结束搜索的正则表达式的索引。与值Pattern.match()和Pattern.seach()方法同名的参数相同。5.lastindex:文本中最后捕获的数据包的索引。如果没有捕获到数据包,则为无。6.lastgroup:上次捕获的数据包的别名。如果此数据包没有别名或没有捕获的数据包,它将为无。方法:1.group([group1,…]):获取一个或多个被组截取的字符串;当指定多个参数时,它们将作为元组返回。Group1可以使用数字或别名;0表示整个匹配的子字符串;未填写参数时,返回组(0);没有截获字符串的组返回无;多次截取的组返回最后截取的子串。2.groups([default]):以元组的形式返回所有组截取的字符串。相当于主叫组(1,2,…最后)。Default表示未截取字符串的组被该值替换,默认值为None。3.groupdict([default]):返回字典,其中别名组的别名作为关键字,该组截取的子字符串作为值。不包括没有别名的组。Default和上面的意思一样。4.start([group]):返回字符串中指定组截取的子字符串的开始索引(子字符串第一个字符的索引)。组默认值为0。5.end([group]):返回字符串中指定组截取的子字符串的结束索引(子字符串最后一个字符的索引1)。组默认值为0。6.span([group]):返回(开始(group),结束(group))。7.expand(template):将匹配的数据包替换到模板中并返回。您可以在模板中使用\id或\g或\g引用分组,但不能使用数字0。\id相当于\ g;但是,10将被视为第10组。如果要在\1后表示字符“0”,只能使用\g0。让我们用一个例子来体验一下。
# -*- coding: utf-8 -*-#一个简单的匹配实例import re#匹配以下内容:单词空白单词任意字符m=re.match(r'(\w) (\w)(?Psign。*)’,‘你好世界!’)print 'm.string: ',m.stringprint 'm.re: ',m.reprint 'm.pos: ',m.posprint 'm.endpos: ',m . end posprint ' m . last index print ' m . last group : ',m . last group print ' m . group(): ',m.group()print 'm.group(1,2)3: ',m .# m . re: # m . pos : 0 # m . end pos : 12 # m . last index : 3 # m . last group :符号# m.group(1,2): ('hello ',' world')# m.groups(): ('hello ',' world ','!)# m . group dict(): { ' sign ' : '!} # m . start(2): 6 # m . end(2): 11 # m . span(2):(6,11)# m . expand(r ' \ 2 \ 1 \ 3 '): world hello!(2) re。search (pattern,string [,flags])该搜索方法与match方法非常相似,不同的是match()函数只检测字符串开头位置是否re匹配,search()扫描整个字符串查找匹配,match()只有在0位置匹配成功才会返回,如果在开头位置匹配不成功,match()将返回None。同样,搜索方法的返回对象也匹配()返回对象的方法和属性。让我们用一个例子来感受一下。
# import re模块import re #将正则表达式编译成Pattern对象pattern=re.compile(r'world')#使用search()查找匹配的子串,如果没有可以匹配的子串,它将返回None#在本例中,match=re。搜索(模式,‘你好世界!)无法与match()成功匹配。)如果Match: #使用Match获取分组信息print match . group()# # # output # # # world(3)re . split(pattern,string [,maxsplit])根据可以匹配的子字符串划分字符串并返回列表。Maxsplit用于指定拆分的最大数量,并不指定所有拆分。让我们通过下面的例子来感受一下。
import repattern=re.compile(r ' \ d ')print re . split(pattern,'一一二三四')# # output # # # ['一','二','三','四','] (4)。让我们看看这个例子。
import repattern=re.compile(r ' \ d ')print re . find all(pattern,'一一二三四')# # output # #[' 1 ',' 2 ',' 3 ',' 4'] (5) re.finisher (5)。让我们通过下面的例子来感受一下。
import repattern=re.compile(r ' \ d ')for m in re . finisher(pattern,'一一二三四四'): print m.group(),# # # output # # # 1 2 3 4(6)re . sub(pattern,repl,string[,count])用Repl替换字符串中每个匹配的子字符串,并返回替换后的字符串。当repl是字符串时,可以使用\id或\g或\g来表示分组,但不能使用数字0。当repl是一个方法时,这个方法应该只接受一个参数(Match对象)并返回一个字符串进行替换(返回的字符串不能再引用分组)。计数用于指定最大替换次数。如果未指定,则进行所有替换。
import re pattern=re.compile(r '(\ w)(\ w ')s='我说,你好世界!'print re.sub(模式,r'\2 \1 ',s)def func(m): return m . group(1)。title() ' ' m.group(2)。title() print re.sub(pattern,func,s) ### output ###说我,世界你好!#我说,你好世界!(7) re。sub n (pattern,repl,string [,count])返回(sub(repl,string[,count]),替换次数)。
import re pattern=re.compile(r '(\ w)(\ w ')s='我说,你好世界!'print re.subn(模式,r'\2 \1 ',s)def func(m): return m . group(1)。title() ' ' m.group(2)。title() print re.subn(pattern,func,s) ### output ###(“说我,世界你好!”,2)#('我说,你好世界!', 2) 5.Python RE模块的另一种用法。
在上面,我们介绍了匹配、搜索等七种工具方法。但是调用方法都是re.match,re.search其实还有一个调用方法,可以通过pattern.match,pattern.search调用,这样就不需要传入pattern作为第一个参数,可以任意调用。
应用编程接口列表
match(string[,pos[,endpos]]) | re.match(pattern,string[,flags]) search(string[,pos[,endpos]]) | re.search(pattern,string[,flags]) split(string[,maxsplit]) | re.split(pattern,string[,maxsplit]) findall(string[,pos[,endpos]]) | re.findall(pattern,string[,string[,flags])| find ITER(string,string[,end[,flags])| re . find ITER(patternsub (pattern,repl,string [,count])具体的调用方法不需要详细描述,原理也差不多,只是参数不同。朋友们,试一试吧~
来吧,我的朋友们,即使这部分有雾也没关系。接下来,我们将通过一些实际的例子来帮助你掌握正则表达式。
版权声明:播放python爬虫的正则表达式是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。