Python之re模块的正则表达式学习_第1页
Python之re模块的正则表达式学习_第2页
Python之re模块的正则表达式学习_第3页
Python之re模块的正则表达式学习_第4页
Python之re模块的正则表达式学习_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 Python 之 【re模块的正则表达式学习】 摘要:      re模块包括操作正则表达式的函数,一些工作中都需要用到,现在说明下使用方法。使用说明:一,re模块下的函数:           函数            描述compile(pattern)创建模式对象search(pattern,string)在字符串中寻找模式m

2、atch(pattern,string)在字符串开始处匹配模式split(pattern,string)根据模式分割字符串findall(pattern,string)列表形式返回匹配项sub(pat,repl,string)pat匹配想用repl替换escape(string)特殊字符转义         1,compile:>>> import re>>> pat=pile('A')>>> m=pat.search('CBA

3、')>>> print m<_sre.SRE_Match object at 0x9d690c8> #匹配到了,返回MatchObject(True)>>> m=pat.search('CBD')>>> print mNone #没有匹配到,返回None(False)#上面的等价于>>> re.search('A','CBA')<_sre.SRE_Match object at 0xb72cd170>#推荐都用第一种方法说明:将正则表达式转换为

4、模式对象,实现更有效率的匹配,因为其他的函数会在内部进行转换。2,search:>>> m = re.search('asd','ASDasd')>>> print m<_sre.SRE_Match object at 0xb72cd6e8> #匹配到了,返回MatchObject(True)>>> m = re.search('asd','ASDASD')>>> print mNone #没有匹配到,返回None(False)说明:在给定的字符串

5、中寻找第一个匹配给正则表达式的子字符串,有多个也只返回第一个出现的。3,match:>>> m = re.match('a','Aasd')>>> print mNone #没有匹配到,返回None(False>>> m = re.match('a','aASD')>>> print m<_sre.SRE_Match object at 0xb72cd6e8> #匹配到了,返回MatchObject(True)可以用第一个方法:compile>

6、;>> pat=pile('a')>>> printpat.match('Aasd')None>>> printpat.match('aASD')<_sre.SRE_Match object at 0xb72cd6e8>说明:在给定的字符串的开头匹配正则表达式。上面的函数返回都可以在if条件语句中进行判断:>>> if pat.search('asd'):. print 'OK'. OK #找到返回>>> if re.s

7、earch('a','ASD'):. print "OK". #没有找到4,split:>>> re.split(',','a,s,d,asd')'a', 's', 'd', 'asd' #返回列表>>> pat = pile(',')>>> pat.split('a,s,d,asd')'a', 's', 'd',

8、'asd' #返回列表>>> re.split(', +','a , s ,d ,asd') #正则匹配:, +,后面说明'a', 's', 'd', 'asd'>>> re.split(', +','a , s ,d ,asd',maxsplit=2) # maxsplit 最多分割次数'a', 's', 'd ,asd'>>> pat = pile

9、(', +') #正则匹配:, +,后面说明>>> pat.split('a , s ,d ,asd',maxsplit=2) # maxsplit 最多分割次数'a', 's', 'd ,asd'说明:根据模式的匹配项来分割字符串,类似字符串的split 的方法,但是字符串的split只能用固定长度的分割符,而re.split允许用任意长度和个数的分割符。5,findall:>>> re.findall('a','ASDaDFGAa') '

10、;a', 'a' #列表形式返回匹配到的字符串>>> pat = pile('a')>>> pat.findall('ASDaDFGAa')'a', 'a' #列表形式返回匹配到的字符串>>> pat = pile('A-Z+') #正则匹配:'A-Z+' 后面有说明>>> pat.findall('ASDcDFGAa')'ASD', 'DFGA' #找到匹

11、配到的字符串>>> pat = pile('A-Z')>>> pat.findall('ASDcDFGAa') #正则匹配:'A-Z+' 后面有说明'A', 'S', 'D', 'D', 'F', 'G', 'A' #找到匹配到的字符串>>> pat = pile('A-Za-z') #正则匹配:'A-Za-z+' 匹配所有单词,后面有说明>&g

12、t;> pat.findall('ASDcDFGAa')'A', 'S', 'D', 'c', 'D', 'F', 'G', 'A', 'a' 说明:列表形式返回给定模式的匹配项。返回所有匹配的字符串。6,sub:>>> re.sub('a','A','abcasd') #找到a用A替换,后面见和group的配合使用'AbcAsd'>>&

13、gt; pat = pile('a')>>> pat.sub('A','abcasd')'AbcAsd'#通过组进行更新替换:>>> pat=pile(r'www.(.*).3') #正则表达式>>> pat.match('').group(1)'dxy'>>> pat.sub(r'1','hello,') #通过正则匹配找到符合规则的”“ ,取得组1字符串 去替换 整个匹配得到字

14、符串。'hello,dxy'>>> pat=pile(r'(w+) (w+)') #正则表达式>>> s='hello world ! hello hz !'>>> pat.findall('hello world ! hello hz !')('hello', 'world'), ('hello', 'hz')>>> pat.sub(r'2 1',s) #通过正则得到组1(hel

15、lo),组2(world),再通过sub去替换。即组1替换组2,组2替换组1,调换位置。 'world hello!hz hello!'说明:使用给定的内容替换掉找到的字符串。a->A>>> dir(m)'_class_', '_copy_', '_deepcopy_', '_delattr_', '_doc_', '_format_', '_getattribute_', '_hash_', '_init_',

16、 '_new_', '_reduce_', '_reduce_ex_', '_repr_', '_setattr_', '_sizeof_', '_str_', '_subclasshook_', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'last

17、index', 'pos', 're', 'regs', 'span', 'start', 'string'7,escape:>>> re.escape('')'' #转义说明:对字符串里面的特殊字符串进行转义。上面的函数中,只有match、search有group方法,其他的函数没有。二,函数的方法:>>> dir(m)'_class_', '_copy_', '

18、_deepcopy_', '_delattr_', '_doc_', '_format_', '_getattribute_', '_hash_', '_init_', '_new_', '_reduce_', '_reduce_ex_', '_repr_', '_setattr_', '_sizeof_', '_str_', '_subclasshook_', &

19、#39;end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'这里介绍几个: 方法       &

20、#160;      描述group获取子模式(组)的匹配项start给定组匹配项的开始位置end给定组匹配项的结束位置span给定组匹配项的开始结束位置      >>> pat = pile(r'www.(.*).(.*)') #用()表示一个组,2个组>>> m = pat.match('')>>> m.group() #默认为0,表示匹配整个字符串 ''>>>

21、 m.group(1) #返回给定组1匹配的子字符串'dxy'>>> m.group(2)'com'>>> m.start(2) #组2开始的索引8>>> m.end(2) #组2结束的索引11>>> m.span(2) #组2开始、结束的索引(8, 11)>>> m1 = pat.search('')>>> m1.group()''>>> m1.group(1)'dxy'>>&

22、gt; m1.group(2)'com'>>> m1.start(2)8三,正则表达式: 1,元字符:字符         描述.除换行符外的任意字符转义字符.字符集合d数字:0-9D非数字0-9s空白字符trnf、空格S非空白字符sw单词字符A-Za-z0-9W非单词字符w           使用:# "." :通配符>>>

23、; pat=pile('.')>>> pat.match('abc')<_sre.SRE_Match object at 0xb72b6170>>>> pat.match('abc').group()'a' #匹配到了首个字符>>> pat.search('abc').group() 'a'>>> pat.match('n').group() #换行符匹配出错Traceback (most recen

24、t call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'# "" : 转义符>>> pat=pile('.')>>> pat.search('abc.efg').group() #匹配到.'.'>>> pat.findall('abc.

25、efg') #不用group,返回列表'.'# "." : 集合,匹配里面的任意一个元素>>> pat=pile('abc')>>> pat.match('axbycz').group()'a'>>> pat.search('axbycz').group()'a'>>> pat.findall('axbycz')'a', 'b', 'c'

26、# "d" : 数字>>> pat=pile('d') >>> pat.search('ax1by2cz3').group() #匹配到第一个数字:1,返回'1'>>> pat.match('ax1by2cz3').group() #匹配不到(首个不是)返回None,报错,match匹配字符串头Traceback (most recent call last): File "<stdin>", line 1, in <m

27、odule>AttributeError: 'NoneType' object has no attribute 'group'>>> pat.findall('ax1by2cz3') #匹配所有的数字,列表返回'1', '2', '3'# "D" : 非数字>>> pat=pile('D')>>> pat.match('ax1by2cz3').group()'a'>

28、>> pat.search('ax1by2cz3').group()'a'>>> pat.findall('ax1by2cz3')'a', 'x', 'b', 'y', 'c', 'z'# "s" :空白字符 : t、r、n、空格>>> pat=pile('s')>>> pat.findall('rax1 nby2 tcz3')'

29、;r', ' ', 'n', ' ', 't'>>> pat.search('rax1 nby2 tcz3').group()'r'>>> pat.match('rax1 nby2 tcz3').group()'r'# "S" :非空白字符>>> pat=pile('S')>>> pat.search('rax1 nby2 tcz3').

30、group()'a'>>> pat.findall('rax1 nby2 tcz3')'a', 'x', '1', 'b', 'y', '2', 'c', 'z', '3'# "w" :单词字符,数字和字母:A-Za-z0-9>>> pat=pile('w')>>> pat.search('1a2b3c').grou

31、p()'1'>>> pat.findall('1a2b3c')'1', 'a', '2', 'b', '3', 'c'>>> pat.match('1a2b3c').group()'1'# "W":非单词字符,除数字和字母外>>> pat=pile('W')>>> pat.findall('1a2我b3c')

32、9;xe6', 'x88', 'x91'>>> pat.search('1a2我b3c').group()'xe6'2,数量词:会出现贪婪模式数量词              描述*匹配前一个字符0次或则多次+匹配前一个字符1次或则多次?匹配前一个字符0次或则1次m匹配前一个字符m次m,n匹配前一个字符m次到n次数量词?非贪婪模式    

33、    使用:# "*" :0次或则多次>>> pat = pile('abc*')>>> pat.match('abcabcdefabc').group() 'abcabc' #2次>>> pat.search('abcabcdefabc').group()'abcabc' #2次>>> pat.findall('abcabcdefabc')'abcabc&#

34、39;, '', '', '', 'abc', '' #2次和1次,因为有0次,所以匹配了''# "+" :1次或则多次>>> pat = pile('abc+')>>> pat.match('abcdefabcabc').group()'abc'>>> pat.search('abcdefabcabc').group()'abc'>>

35、> pat.findall('abcdefabcabc')'abc', 'abcabc'# "?" :0次或则1次,match,search 不会出现none,会出现''>>> pat = pile('abc?')>>> pat.match('defabc').group() #0次''>>> pat.match('abcdefabc').group()'a'>>

36、;> pat.search('defabc').group() #0次''>>> pat.findall('defabc') #0次和1次'', '', '', 'a', 'b', 'c', ''# "m" :匹配字符串出现m次>>> pat = pile('op2') #o或则p出现2次>>> pat.search('abcooap

37、p').group() #匹配第一次出现的字符串,o比p先出现'oo'>>> pat.findall('abcooapp') #匹配出现的所有字符串,列表形式返回'oo', 'pp'# "m,n" :匹配字符串出现m到n次>>> pat = pile('op2,4') #o或则p出现2到4次>>> pat.match('pppabcooapp').group() #匹配开头'ppp'>>&g

38、t; pat.search('pppabcooapp').group() #匹配第一次出现'ppp'>>> pat.findall('pppabcooapp') #匹配所有'ppp', 'oo', 'pp'# "数量词?" :非贪婪模式:只匹配最少的(尽可能少);默认贪婪模式:匹配最多的(尽可能多)>>> pat = pile('abc+') #贪婪模式>>> pat.match('abcdefabca

39、bc').group() #匹配尽可能多的:abc'abc'>>> pat.match('bbabcdefabcabc').group()'bbabc'>>> pat.search('dbbabcdefabcabc').group()'bbabc'>>> pat.findall('abcdefabcabc')'abc', 'abcabc'>>> pat = pile('abc+?&

40、#39;) #非贪婪模式:+?>>> pat.match('abcdefabcabc').group() #匹配尽可能少的:a、b、c'a'>>> pat.search('dbbabcdefabcabc').group()'b'>>> pat.findall('abcdefabcabc')'a', 'b', 'c', 'a', 'b', 'c', 'a'

41、;, 'b', 'c'3,边界边界词          描述     匹配字符串开头和行首$匹配字符串结尾和行尾A匹配字符串开头Z匹配字符串结尾b匹配w 和 W 之间       使用:# "" :匹配字符串开头或则行头>>> pat = pile('abc') #开头是abc>>>

42、pat.search('defabc').group() >>> pat.match('defabc').group() #均找不到>>> pat.findall('defabc')>>> pat.search('adefabc').group()'a'>>> pat.match('adefabc').group() #开头是a、b、c中的任意一个'a'>>> pat.findall('

43、adefabc')'a'>>> pat = pile('abc+') #开头是a、b、c中的任意一个的一次或则多次,贪婪:匹配多个>>> pat.findall('cbadefab')'cba'>>> pat = pile(r'abc+?') #开头是a、b、c中的任意一个的一次或则多次,非贪婪:匹配一个>>> pat.findall('cbadefab')'c'# "$" :匹配字符

44、串结尾或则行尾>>> pat = pile('abc$')>>> pat.match('adefAbc').group() #match匹配的是字符串开头,所以查找$的时,总是返回None>>> pat.search('adefAbc').group() #结尾是a、b、c中的任意一个'c'>>> pat.findall('adefAbc') 'c'>>> pat = pile('abc+$')

45、>>> pat.search('adefAbc').group() #结尾是a、b、c中的任意一个的一次或则多次,贪婪:匹配多个'bc'>>> pat.findall('adefAbc')'bc'# "A":匹配字符串开头>>> pat = pile('Aabc+')>>> pat.findall('cbadefab')'cba'>>> pat.search('cba

46、defab').group()'cba'# "Z":匹配字符串结尾>>> pat = pile('abc+Z')>>> pat.search('cbadefab').group()'ab'>>> pat.findall('cbadefab')'ab'4,分组:这里有个例子:分组方法描述|左右表达式任意匹配一个,先匹配左边一旦成功则跳过匹配右边,如果|没有包含在()中,匹配整个正则表达式  (.) 分组匹配,从

47、左到右,每遇到一个 ( 编号+1,分组后面可加数量词(?P<name>.)除了分组序号外,指定一个 name的别名<number> 引用编号为<number>的分组匹配到的字符串(?P=name) 引用别名为<name>的分组匹配到的串        使用:# "(.)" :在模式里面用()来表示分组(匿名分组),适用于提取目标字符串中的某一些部位。>>> pat=pile(r'(a)w(c)') #w:单词字符A

48、-Za-z0-9>>> pat.match('abcdef').group()'abc'>>> pat=pile('(a)b(c)') #分2组,匿名分组>>> pat.match('abcdef').group() #默认返回匹配的字符串'abc'>>> pat.match('abcdef').group(1) #取分组1,适用于search'a'>>> pat.match('abcd

49、ef').group(2) #取分组2,适用于search'c'>>> pat.match('abcdef').groups() #取所有分组,元组形式返回('a', 'c')>>> pat=pile(r'www.(.*).3')>>> pat.match('').group(1)'dxy'# "(?P<name>.)" :在模式里面用()来表示分组(命名分组),适用于提取目标字符串中的某一

50、些部位。>>> pat=pile(r'(?P<K>a)w(c)') #分2组:命名分组+匿名分组>>> pat.search('abcdef').groups() #取所有分组,元组形式返回('a', 'c')>>> pat.search('abcdef').group(1) #取分组1,适用于match'a'>>> pat.search('abcdef').group(2) #取分组2,适用于mat

51、ch'c'>>> pat.search('abcdef').group() #默认返回匹配的字符串'abc'>>> pat.search('abcdef').groupdict() #命名分组可以返回一个字典【专有】,匿名分组也没有'K': 'a'# "(?P=name)" :引用命名分组(别名)匹配:>>> pat=pile(r'(?P<K>a)w(c)(?P=K)') #(?P=K)引用分组1的

52、值,就是a>>> pat.search('abcdef').group() #匹配不到,因为完整'awca',模式的第4位是aTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'>>> pat.search('abcadef').gro

53、up() #匹配到,模式的第4位和组1一样,值是c'abca'>>> pat.search('abcadef').groups()('a', 'c')>>> pat.search('abcadef').group(1)'a'>>> pat.search('abcadef').group(2)'c# "<number>" :引用分组编号匹配:>>> pat=pile(r

54、9;(?P<K>a)w(c)(?P=K)2') #2引用分组2的值,就是c>>> pat.findall('Aabcadef') #匹配不到,因为完整'awcac',模式的第5位是c>>> pat.findall('Aabcacdef') #匹配到,模式的第5位和组2一样,值是c('a', 'c')>>> pat.search('Aabcacdef').groups()('a', 'c')>

55、;>> pat.search('Aabcacdef').group()'abcac'>>> pat.search('Aabcacdef').group(1)'a'>>> pat.search('Aabcacdef').group(2)'c'5,特殊构造方法描述(?:.)(.)不分组版本,用于使用 | 或者后接数量词(?iLmsux)iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个(?#.) #号后的内容将作为注释(?=.) 之

56、后的字符串内容需要匹配表达式才能成功匹配(?!.) 之后的字符串不匹配表达式才能成功(?<=.) 之前的字符串需要匹配表达式才能成功(?<!.) 之前的字符串需要不匹配表达式才能成功(?(id/name) yes |no)如果编号为id/名字为name的组匹配到字符串,则需要匹配yes,否则匹配no,no可以省略           使用:# "(?:.)" :()里面有?:表示该()不是分组>>> pat=pile(r'a(?

57、:bc)')>>> pat.findall('abc')'abc'>>> pat.match('abc').groups() #显示不出分组()# "(?=.)":匹配.表达式,返回。对后进行匹配,总是对后面进行匹配>>> pat=pile(r'w(?=d)') #匹配表达式d,返回数字的前一位,w:单词字符A-Za-z0-9>>> pat.findall('abc1 def1 xyz1')'c',

58、'f', 'z'>>> pat.findall('zhoujy20130628hangzhou') #匹配数字的前一位,列表返回'y', '2', '0', '1', '3', '0', '6', '2'>>> pat=pile(r'w+(?=d)')>>> pat.findall('abc1,def1,xyz1') #匹配最末数字的前

59、字符串,列表返回'abc', 'def', 'xyz'>>> pat.findall('abc21,def31,xyz41')'abc2', 'def3', 'xyz4'>>> pat.findall('zhoujy20130628hangzhou')'zhoujy2013062'>>> pat=pile(r'A-Za-z+(?=d)') #A-Za-z,匹配字母,可以用其他的正则方

60、法>>> pat.findall('zhoujy20130628hangzhou123') #匹配后面带有数字的字符串,列表返回'zhoujy', 'hangzhou'>>> pat.findall('abc21,def31,xyz41')'abc', 'def', 'xyz'# "(?!.)" 不匹配.表达式,返回。对后进行匹配>>> pat=pile(r'A-Za-z+(?!d)') #A-Za-z,匹配字母,可以用其他的正则方法>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') #匹配后面不是数字的字符串,列表返回'zhouj', '

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论