当前位置: 首页 > 科技观察

俗话说:学好正则表达式,全世界都好!最详细的正则入门教程!

时间:2023-03-20 01:05:01 科技观察

简介正则表达式(regularexpressions)是可以匹配文本片段的模式。最简单的正则表达式是一个匹配自身的普通字符串。例如,正则表达式“hello”匹配字符串“hello”。re模块在Python中,我们可以使用内置的re模块来处理正则表达式。私信小编007送PDF几十套!使用compile函数将正则表达式的字符串形式编译成Pattern对象。使用Pattern对象提供的一系列方法对文本进行匹配查找,得到匹配结果(一个Match对象)。***使用Match对象提供的属性和方法获取信息,根据需要进行其他操作用于查找字符串的头部(也可以指定起始位置),是one-match匹配,找到一个匹配就返回,而不是查找所有匹配。它的一般使用形式如下:match(string[,pos[,endpos]])其中string为要匹配的字符串,pos和endpos为可选参数,指定字符串的开始和结束位置,默认值分别是0和len(字符串长度)。因此,当不指定pos和endpos时,match方法默认匹配字符串的头部。上面匹配成功返回一个Match对象,其中:group([group1,…])方法用于获取一组或多组匹配的字符串,当想获取整个匹配的子串时,可以使用直接分组()或分组(0);start([group])方法用于获取group匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为0;end([group])方法用于获取group匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为0;跨度([组])方法返回(开始(组),结束(组))。search方法search方法用于查找字符串的任意位置,它也是一个匹配,只要找到一个匹配的结果就会返回,而不是搜索所有匹配的结果,它的一般使用形式如下:search(string[,pos[,endpos]])其中,string为要匹配的字符串,pos和endpos为可选参数,指定字符串的开始和结束位置,默认值为0和len(字符串长度)分别。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)printresult1printresult2execution结果:['123456','789']['1','2']finditer方法finditer方法的行为类似于findall。它还搜索整个字符串并获得所有匹配结果。但它返回一个迭代器,该迭代器按顺序访问每个匹配结果(Match对象)。split方法split方法根据可以匹配的子字符串拆分字符串并返回一个列表。其用法如下:split(string[,maxsplit])其中,maxsplit用于指定最大拆分次数,不指定则全部拆分。看例子:如果repl是一个字符串,repl会被用来替换字符串的每一个匹配的子串,并返回替换后的字符串。另外,repl也可以用id的形式来指代组,而不是数字0;如果repl是一个函数,该方法应该只接受一个参数(Match对象)并返回一个用于替换的字符串(返回的字符串中不能引用组)。count用于指定最大替换次数,不指定则全部替换。它返回一个元组:(sub(repl,string[,count]),numberofsubstitutions)该元组有两个元素,第一个元素是使用sub方法的结果,第二个元素返回原始字符串被替换的次数。看例子:其实compile函数生成的Pattern对象的一系列方法对应re模块的大部分函数,??只是在用法上有细微差别。匹配函数匹配函数的使用形式如下:搜索函数搜索函数的使用形式如下:re.search(pattern,string[,flags])搜索函数不能指定字符串的搜索范围,它的用法类似于Pattern对象的搜索方法。findall函数findall函数的使用形式如下:re.findall(pattern,string[,flags])findall函数不能指定字符串的搜索范围,其用法类似于Pattern对象的findall方法.看例子:importreprintre.findall(r'd+','hello12345789')#output['12345','789']finditer函数finditer函数的使用类似于Pattern的finditer方法,形式如下:re.finditer(pattern,string[,flags])splitfunctionsplit函数使用如下:re.split(pattern,string[,maxsplit])subfunctionsubfunction使用如下:re.sub(pattern,repl,string[,count])subn函数subn函数的使用形式如下:re.subn(pattern,repl,string[,count])使用哪种方式?从上面可以看出,re模块的使用有两种方式:使用re.compile函数生成一个Pattern对象,然后使用Pattern对象的一系列方法进行文本的匹配和查找;直接使用re.match、re.search、re.findall等函数直接匹配搜索文本;下面,我们用一个例子来展示这两种方法。先看第一个用法:importre#将正则表达式编译成Pattern对象pattern=re.compile(r'd+')printpattern.match('123,123')printpattern.search('234,234')printpattern.findall('345,345')看第二种用法:importreprintre.match(r'd+','123,123')printre.search(r'd+','234,234')printre.findall(r'd+','345,345')如果一个正则表达式需要多次使用(比如上面的d+),往往会用到很多场合,为了效率考虑,我们应该预先编译正则表达式,生成一个Pattern对象,然后使用该对象的一系列方法来匹配需要匹配的文件;如果直接使用re.match、re.search等函数,每次传入一个正则表达式,都会编译一次,效率会大大降低。因此,我们推荐用法1.匹配中文在某些情况下,我们希望匹配文本中的汉字。需要注意的一点是中文的unicode编码范围主要在[u4e00-u9fa5]。这主要是因为这个范围并不完整,例如,它不包括全角(中文)标点符号,但是在大多数情况下应该足够了。假设现在你想从字符串中提取中文title=u'Hello,hello,world',你可以这样做:#-*-coding:utf-8-*-importretitle=u'Hello,hello,world'pattern=re.compile(ur'[\u4e00-\u9fa5]+')result=pattern.findall(title)printresult注意我们在正则表达式前面加了两个前缀ur,其中r表示使用Originalstring,u表示unicode字符串。执行结果:[u'\u4f60\u597d',u'\u4e16\u754c']贪心匹配在Python中,正则匹配默认为贪心匹配(少数语言可能是非贪心的),即匹配尽可能多的字符可能的。例如,我们要查找字符串中的所有div块:importrecontent='aa

test1
bb
test2
cc'pattern=re.compile(r'
.*
')result=pattern.findall(content)printresult执行结果:['
test1
bb
test2
']因为正则匹配是贪心匹配,即尽可能多的匹配,所以当第一个匹配成功的时候,它也会尝试向右匹配,看是否有更长的子串可以匹配成功。如果我们要非贪婪匹配,可以加一个?,如下:importrecontent='aa
test1
bb
test2
cc'pattern=re.compile(r'
.*?
')#添加?result=pattern.findall(content)打印结果Result:['
test1
','
test2
']Summaryre模块的一般使用步骤如下:使用compile函数将正则表达式的字符串形式编译成Pattern对象;使用Pattern对象提供的一系列方法对文本进行匹配查找,得到匹配结果(一个Match对象);***使用Match对象提供的属性和方法可以获取信息,可以根据需要进行其他操作;Python的正则匹配默认是贪心匹配。