手机版

Python正则表达式操作指南

时间:2021-10-02 来源:互联网 编辑:宝哥软件园 浏览:

Python从1.5版本开始增加re模块,提供Perl风格的正则表达式模式。在Python 1.5之前,Emacs风格的模式是通过regex模块提供的。Emacs风格的模式可读性稍差,功能性也较差,所以在编写新代码时尽量不要使用regex模块。当然,偶尔你可能会在旧代码中找到它。

1.正则表达式基金会。

1.1.简介。

正则表达式不是Python的一部分。正则表达式是处理字符串的强大工具。它有自己独特的语法和独立的处理引擎。它可能不如str自己的方法高效,但它非常强大。得益于此,在提供正则表达式的语言中,正则表达式的语法都是一样的,唯一的区别就是不同编程语言支持的语法数量不同。但别担心。不支持的语法通常是不常见的部分。如果您已经在其他语言中使用了正则表达式,您只需要简单地看一下就可以开始了。

下图显示了使用正则表达式进行匹配的过程:

正则表达式的近似匹配过程如下:依次将表达式与文本中的字符进行比较,如果每个字符都能匹配,则匹配成功;一旦出现不成功的字符,匹配就会失败。如果表达中有量词或界限,这个过程会略有不同,但也很容易理解。请看下图中的例子,并多次使用。

下图列出了Python支持的正则表达式元字符和语法:

1.2.量词的贪婪模式和非贪婪模式。

正则表达式通常用于在文本中查找匹配的字符串。在Python中,量词默认是贪婪的(或者在少数语言中默认是非贪婪的),并且总是试图匹配尽可能多的字符。相反,那些不贪婪的人总是试图匹配尽可能少的字符。例如,如果使用正则表达式“ab*”来查找“abbbc”,将会找到“abbb”。如果使用非贪婪量词“ab*?”。会找到‘一个’。

1.3.反斜杠。

像大多数编程语言一样,正则表达式使用“\”作为转义字符,这可能会导致反斜杠问题。如果需要匹配文本中的字符“\”,那么在用编程语言表示的正则表达式中将需要四个反斜杠“\ \ \”:前两个和后两个用于在编程语言中转义成反斜杠,然后在转换成两个反斜杠后在正则表达式中转义成反斜杠。Python中的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以用r'\\ '来表示。类似地,与数字匹配的“\\d”可以写成“r”\ d”。有了原生字符串,就不用再担心缺少反斜杠了,书写的表达式也更加直观。

1.4.匹配模式。

正则表达式提供了一些可用的匹配模式,如忽略大小写、多行匹配等,这些将在pattern类的factory方法re.compile(pattern[,flags])中引入。

2.re模块。

2.1.开始使用re。

Python re模块支持正则表达式。使用re的一般步骤是将正则表达式的字符串形式编译成Pattern实例,然后使用Pattern实例处理文本并获得matching结果(一个Match实例),最后使用Match实例获取信息并执行其他操作。

# encoding: UTF-8import re#将正则表达式编译成Pattern对象Pattern=re.compile(r'hello')#使用Pattern匹配文本,得到匹配结果。如果无法匹配,它将返回none match=pattern。match ('hello world!').)如果Match: #使用Match获取分组信息print match . group()# # # output # # # hellore.compile(strPattern[,flag]) :这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译成Pattern对象。第二个参数标志是匹配模式,它的值可以用按位or运算符“|”表示,如re。我| re。m此外,还可以在正则表达式字符串中指定模式,比如re.compile('pattern ',re。我| re。m)并重新编译('(?im)pattern’)是等效的。可选值有:

Re。我(re。IGNORECASE):忽略大小写(括号内完整书写,下同)M(MULTILINE):多行模式,改变“”和“$”的行为(见上图)S(DOTALL):任意匹配模式,改变“.”的行为l(区域设置)。S \S取决于当前区域设置U(UNICODE):因此预定的字符类\ w \ w \ b \ s \ s \ d \ d取决于由UNICODE定义的字符属性x (verbose) 3360的详细模式。在这种模式下,正则表达式可以是多行的,空白字符可以忽略,并且可以添加注释。

以下两个正则表达式是等价的:

A=重新编译(r ' ' ' \ d #整数部分\。#小数点\ d * #某些小数位数'',re.x) b=re.compile (r' \ d \。\ d *') re提供了许多模块方法。这些方法可以被模式实例的相应方法替换。唯一的优点是节省了一行re.compile()代码,但是编译后的Pattern对象不能同时重用。这些方法将在Pattern类的实例方法部分一起介绍。例如,上面的例子可以缩写为:

m=re.match(r'hello ',' hello world!)print m.group()re模块还提供了一个方法escape(string),用于转换正则表达式元字符,如*//?返回前添加转义字符,这在需要大量匹配元字符时非常有用。

2.2.比赛

match对象是match的结果,它包含了很多关于这个Match的信息,这些信息可以通过使用Match提供的可读属性或方法来获得。

属性:

String:匹配时使用的文本。

Re:匹配时使用的模式对象。

Pos:文本中正则表达式开始搜索的索引。与值Pattern.match()和Pattern.seach()方法同名的参数相同。

Endpos:文本中结束搜索的正则表达式的索引。与值Pattern.match()和Pattern.seach()方法同名的参数相同。

Lastindex:文本中最后捕获的数据包的索引。如果没有捕获到数据包,则为无。

Lastgroup:上次捕获的数据包的别名。如果此数据包没有别名或没有捕获的数据包,它将为无。

方法:

群组([群组1、…]):

获取数据包截取的一个或多个字符串;当指定多个参数时,它们将作为元组返回。Group1可以使用数字或别名;0表示整个匹配的子字符串;未填写参数时,返回组(0);没有截获字符串的组返回无;多次截取的组返回最后截取的子串。

组([默认]):

以元组的形式返回所有数据包截获的字符串。相当于主叫组(1,2,…最后)。Default表示未截取字符串的组被该值替换,默认值为None。

group dict([默认值]):

以别名组的别名作为关键字,以该组截取的子字符串作为值,返回字典。不包括没有别名的组。Default和上面的意思一样。

start([group]):

返回字符串中指定组截取的子字符串的起始索引(子字符串第一个字符的索引)。组默认值为0。end([group]):

返回字符串中指定组截取的子字符串的结束索引(子字符串最后一个字符的索引1)。组默认值为0。

span([group]):

后退(开始(组),结束(组))。

展开(模板):

将匹配的组替换到模板中并返回。您可以在模板中使用\id或\gid或\gname引用分组,但不能使用数字0。\id相当于\ gid但是,10将被视为第10组。如果要在\1后表示字符“0”,只能使用\g10。

import rem=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.lastgroupprint 'm.group(1,2): ',m.group(1,2)print 'm.groups()# m.re: _sre。0x016 E1 a 38 # m . poss : 0 # m . end poss : 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.3.模式

Pattern对象是一个编译好的正则表达式,文本可以通过Pattern提供的一系列方法进行匹配和搜索。

模式不能直接实例化,必须使用re.compile()构造。

模式为获取表达式信息提供了几个可读的属性:

Pattern:编译中使用的表达式字符串。

标志:编译的匹配模式。数字形式。

Groups:表达式中的组数。

Groupindex:字典,其关键字是表达式中带有别名的组的别名,其值是对应于该组的数字。不包括没有别名的组。

import rep=re.compile(r'(\w ) (\w)(?Psign。*)’,re。DOTALL)打印' p.pattern: ',p . patternprint ' p . flag : ',p . flag sprint ' p . group s 3360 ',p . group sprint ' p . group index : ',p . group index # # # output # # # p . pattern :(\ w)(\ w)(?Psign。*)# p . flags : 16 # p . groups : 3 # p . group index : { ' sign ' : 3 }示例方法[| re module方法]:

Match (string [,pos [,end pos]]) | re.match (pattern,string [,flags]) :此方法将尝试从字符串的pos下标匹配模式;如果模式在最后仍然可以匹配,则返回一个匹配对象。如果模式在匹配过程中无法匹配,或者匹配在结束前已经到达终点,则返回无。

pos和endpos的默认值分别为0和len(字符串);Re.match()不能指定这两个参数,参数标志用于在编译模式时指定匹配模式。注意:此方法不完全匹配。在模式结束时,如果字符串中还有字符,仍然会被视为成功。为了精确匹配,可以在表达式的末尾添加一个边界匹配器“$”。

示例见第2.1小节。

Search (string [,pos [,end pos]]) | re.search (pattern,string [,flags]) :此方法用于在可以成功匹配的字符串中查找子字符串。尝试从字符串的位置下标匹配模式,如果模式在末尾仍然可以匹配,则返回匹配对象;如果无法匹配,则在pos中添加1,然后再次尝试匹配;如果在pos=endpos之前没有匹配,则返回None。

而pos和endpos的默认值是0和len(string));分别);Re.search()不能指定这两个参数,参数标志用于在编译模式时指定匹配的模式。

# encoding: UTF-8导入re #将正则表达式编译成Pattern对象Pattern=re.compile(r ' world)' #使用search()查找匹配的子字符串,如果没有匹配的子字符串,则不会返回任何子字符串#在本例中,match=Pattern . search(' hello world!)无法与match()成功匹配。)如果Match: #使用Match获取分组信息print match . group()# # # output # # # world split(string [,maxsplit]) | re.split (pattern,string[,maxsplit]) :根据可以匹配的子字符串对字符串进行划分,并将其返回到列表中。Maxsplit用于指定拆分的最大数量,并不指定所有拆分。

import rep=re.compile(r ' \ d ')print p . split(' one 1two 2 tree 344 ')# # output # # #[' one ',' two ',' three ',' four ',']findall(字符串[,pos[,End pos]]) | re。findall (pattern,string [,flags]) :搜索字符串,并以列表的形式返回所有可以匹配的子字符串。

import rep=re.compile(r ' \ d ')print p . find all(' one 1two 2 tree 344 ')# # output # # #[' 1 ',' 2 ',' 3 ',' 4']finditer(string[,pos[,End pos]]) | re.finisher (pattern,string[,flags]) :搜索字符串并返回一个迭代器,该迭代器按顺序访问每个Matching结果(match对象)。

import rep=re.compile(r ' \ d ')for m in p . find ITER(' one 1two 2 tree 344 '): print m . group(),# # # output # # # 1 2 3 4 sub(repl,string[,Count]) | re。sub (pattern,repl,string [,count]) :使用repl替换字符串中每个匹配的子字符串,然后返回替换后的字符串。当repl是字符串时,可以使用\id或\gid或\gname来表示分组,但不能使用数字0。当repl是一个方法时,这个方法应该只接受一个参数(Match对象)并返回一个字符串进行替换(返回的字符串不能再引用分组)。

计数用于指定最大替换次数。如果未指定,则进行所有替换。

import rep=re.compile(r '(\ w)(\ w ')s='我说,你好世界!'打印p.sub(r'\2 \1 ',s)def func(m): return m . group(1)。title() ' ' m.group(2)。title()print p.sub(func,s)### output ###说我,世界你好!#我说,你好世界!Subn (repl,string [,count]) | re.sub (pattern,repl,string [,count]) :返回(sub(repl,string[,count]),替换次数)。import rep=re.compile(r '(\ w)(\ w ')s='我说,你好世界!'打印p.subn(r'\2 \1 ',s)def func(m):返回m.group(1)。title() ' ' m.group(2)。title()print p.subn(func,s)### output ###(“说我,世界你好!”,2)#('我说,你好世界!'2)以上是Python对正则表达式的支持。掌握正则表达式是每个程序员都必须具备的技能。现在没有不处理字符串的程序。作者也在初级阶段,与大家分享,_。

此外,图的特殊构造部分没有例子,所以很难使用这些正则表达式。如果你感兴趣,你可以考虑如何匹配不以abc开头的单词。

版权声明:Python正则表达式操作指南是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。