http://blog.csdn.net/zm2714/article/details/8016323

re模块

开始使用re

Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

  1. # encoding: UTF-8
  2. import re
  3. # 将正则表达式编译成Pattern对象
  4. pattern = re.compile(r'hello')
  5. # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
  6. match = pattern.match('hello world!')
  7. if match:
  8. # 使用Match获得分组信息
  9. print match.group()
  10. ### 输出 ###
  11. # hello

语法:re.compile(strPattern[, flag])

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第一个参数strPattern为正则表达式,第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如:re.compile('(?im)pattern')

re.compile('pattern', re.I | re.M) 与re.compile('(?im)pattern') 是等价的。

flag参数可选值有:

简写 全名 注释
I IGNORECASE 忽略大小写
M MULTILINE 多行模式
S DOTALL 单选模式——点任意匹配模式
L LOCALE 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
U UNICODE 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
X VERBOSE 详细模式。该模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

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

  1. a = re.compile(r"""\d +  # the integral part
  2. \.    # the decimal point
  3. \d *  # some fractional digits""", re.X)
  4. b = re.compile(r"\d+\.\d*")

re提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代。使用re模块方法的唯一好处是少写一行re.compile()代码,缺点是无法复用编译后的Pattern对象,优点和缺点总是相对的,适具体情况使用。为了节约篇幅,这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为:

  1. m = re.match(r'hello', 'hello world!')
  2. print m.group()

re模块还提供了一个方法escape(string),用于将string中的正则表达式元字符如*/+/?等之前加上转义符再返回,在需要大量匹配元字符时有那么一点用。

Match

当需要提取的内容只有一个,或是只需要获取第一次成功匹配的内容时,可以使用Match()方法。当使用Match()方法时,只要在某一位置匹配成功,就不再继续尝试匹配,并返回一个Match类型的对象。注意:Match只从位置0开始匹配,除非使用Pattern对象指定pos参数。在Pattern类的实例方法部分有详细说明。

  1. # encoding: UTF-8
  2. import re
  3. m=re.match(r'a','ababa')
  4. print m.group()

虽然Match()只是取一次匹配,但是可以通过捕获组来获取多个指定子串。

  1. # encoding: UTF-8
  2. import re
  3. m=re.match(r'(a)(b)','ababa')
  4. print m.groups()
  5. #结果为:('a', 'b')

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。

Match属性

1、string:匹配时使用的文本。 
2、re:匹配时使用的Pattern对象。 
3、pos:文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
4、endpos:文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
5、lastindex:最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
6、lastgroup:最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

Match方法

1、group([group1, …])

获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。

  1. # encoding: UTF-8
  2. import re
  3. m=re.match(r'(\w{2})+','aabbcc')
  4. print m.group(1)

结果为:cc

  1. # encoding: UTF-8
  2. import re
  3. s="1-abc,2-abc,3-abc"
  4. pattern=r'(?P<name>\d)-(\w{3}),' #命名捕获组(?P<名字>) 注意:这里的P要大写
  5. m=re.search(pattern,s)
  6. print m.group(),m.group(0)
  7. print m.group(1)
  8. print m.group(2)
  9. print m.group(1,2,0)
  10. print m.group('name')

再说明一下:search,找不到,则继续找,直到结束;如果一旦找到,则综止。而不管后面是否仍有内容匹配,都不在继续。

从以上例子中需掌握以下知识点:

a、group()等于group(0),代表整个匹配的子串
b、group(1),代表编号为1的捕获组内容;group(2)代表编号为2的捕获组内容
c、指定多个参数时,以tuple形式返回。
d、普通捕获组与命名捕获组没有混合编号规则。捕获组的编号统一是按照“(”出现的顺序,从左到右,从1开始进行编号的。
总结:group就是返回捕获的内容。参数0或无参数表示整个正则表达式捕获的文本,1表示第1个括号匹配的内容,2表示第2个括号匹配的内容,以此类推。

2、groups([default])

以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。

例1:

  1. # encoding: UTF-8
  2. import re
  3. s="1-abc,2-abc,3-abc"
  4. pattern=r'((?P<name>\d)-)(\w{3}),'
  5. m=re.search(pattern,s)
  6. print m.groups()

例2:

  1. >>> m=re.match("(\d+)\.(\d+)","23.123")
  2. >>> m.groups()
  3.  ('23', '123')
  4. >>> m=re.match("(\d+)\.?(\d+)?","24") #这里的第二个\d没有匹配到,使用默认值"None"
  5. >>> m.groups()
  6.  ('24', None)
  7. >>> m.groups("0")
  8.  ('24', '0')

3、groupdict([default])

返回命名捕获组字典。以组名为键、以该组截获的子串为值,普通捕获组不包含在内。default含义同上。

  1. >>> m=re.match("(\w+) (\w+)","hello world")
  2. >>> m.groupdict()
  3.  {}
  4. >>> m=re.match("(?P<first>\w+) (?P<secode>\w+)","hello world")
  5. >>> m.groupdict()
  6.  {'secode': 'world', 'first': 'hello'}

通过上例可以看出,groupdict()对普通捕获组不起作用

4、start([group])

返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。

5、end([group])

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

6、span([group])

返回(start(group), end(group))。

7、expand(template)

将匹配到的分组代入template中然后返回。template中可以使用 \id 、\g<id> 、\g<name> 引用分组。id为捕获组的编号,name为命名捕获组的名字。

  1. # encoding: UTF-8
  2. import re
  3. s="abcdefghijklmnopqrstuvwxyz"
  4. pattern=r'(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)'
  5. m=re.search(pattern,s)
  6. print m.expand(r'\1'), m.expand(r'\10'), m.expand(r'\g<10>')

结果为:a j j

知识点:字符串组成

对于字符串“a5”,是由两个字符“a”、“5”以及三个位置组成的,这一点对于正则表达式的匹配原理理解很重要。

  1. import re
  2. m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello world!')
  3. print "m.string:", m.string
  4. print "m.re:", m.re
  5. print "m.pos:", m.pos
  6. print "m.endpos:", m.endpos
  7. print "m.lastindex:", m.lastindex
  8. print "m.lastgroup:", m.lastgroup
  9. print "m.group(1,2):", m.group(1, 2)
  10. print "m.groups():", m.groups()
  11. print "m.groupdict():", m.groupdict()
  12. print "m.start(2):", m.start(2)
  13. print "m.end(2):", m.end(2)
  14. print "m.span(2):", m.span(2)
  15. print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')
  16. ### output ###
  17. # m.string: hello world!
  18. # m.re: <_sre.SRE_Pattern object at 0x016E1A38>
  19. # m.pos: 0
  20. # m.endpos: 12
  21. # m.lastindex: 3
  22. # m.lastgroup: sign
  23. # m.group(1,2): ('hello', 'world')
  24. # m.groups(): ('hello', 'world', '!')
  25. # m.groupdict(): {'sign': '!'}
  26. # m.start(2): 6
  27. # m.end(2): 11
  28. # m.span(2): (6, 11)
  29. # m.expand(r'\2 \1\3'): world hello!

Pattern

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

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

Pattern提供了几个可读属性用于获取表达式的相关信息

1、pattern:编译时用的正则表达式字符串。
2、flags:编译时用的匹配模式。数字形式。
3、groups:表达式中分组的数量。 
4、groupindex:以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。

  1. import re
  2. p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
  3. print "p.pattern:", p.pattern
  4. print "p.flags:", p.flags
  5. print "p.groups:", p.groups
  6. print "p.groupindex:", p.groupindex
  7. ### output ###
  8. # p.pattern: (\w+) (\w+)(?P<sign>.*)
  9. # p.flags: 16
  10. # p.groups: 3
  11. # p.groupindex: {'sign': 3}

实例方法 [ | re模块方法]

1、pattern.match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

匹配成功返回string,失败返回None

这个方法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。
pos和endpos的默认值分别为0和len(string);re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

注意1:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。

注意2:只要匹配成功就不再继续匹配。

比较下面两个例子:

例1:

  1. # encoding: UTF-8
  2. import re
  3. pattern = re.compile(r'h')
  4. match = pattern.match('hi,hello world!')
  5. if match:
  6. print match.group()

例2:

  1. # encoding: UTF-8
  2. import re
  3. pattern = re.compile(r'e')
  4. match = pattern.match('hi,hello world!')
  5. if match:
  6. print match.group()

2、pattern.search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

→ 匹配成功返回string对象,失败返回None

这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern。如果pattern结束时仍可匹配,则返回一个Match对象(即如果找到一个匹配就返回一个MatchObject对象。而不会继续往下匹配。);若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。
pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

例1:

  1. >>> m=re.search("abcd", '1abcd2abcd')
  2. >>> m.group()  #找到即返回一个match object,然后根据该对象的方法,查找匹配到的结果。
  3. 'abcd'
  4. >>> m.start()
  5. 1
  6. >>> m.end()
  7. 5

例2:

  1. # encoding: UTF-8
  2. import re
  3. # 将正则表达式编译成Pattern对象
  4. pattern = re.compile(r'world')
  5. # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None
  6. # 这个例子中使用match()无法成功匹配
  7. match = pattern.search('hello world!')
  8. if match:
  9. # 使用Match获得分组信息
  10. print match.group()
  11. ### 输出 ###
  12. # world

了解match方法与search方法的区别

match方法总是默认从字符串的起始位置开始匹配。就像模式字符串的第一个元素是/A一样。

如果关心发生在字符串的任意位置的匹配,而不是仅发生在字符串首部的匹配,Python管这种操作叫search,为是为了和match有所区别而取的新术语。

3、pattern.split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])

→ 返回list对象

按照能够匹配的子串做为分割符将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。

如果匹配失败,则返回仅有一个值的列表,该值为string字符串。

  1. import re
  2. p = re.compile(r'\d+') #测试匹配失败的结果,将 \d+ 改为下划线 _
  3. print p.split('one1two2three3four4')
  4. ### output ###
  5. # ['one', 'two', 'three', 'four', '']

4、pattern.findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

→ 回list对象

搜索string,以列表形式返回全部能匹配的子串。如果匹配失败,返回空列表[]

  1. import re
  2. p = re.compile(r'\d+')
  3. print p.findall('one1two2three3four4')
  4. ### output ###
  5. # ['1', '2', '3', '4']

5、pattern.finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])

→ 回callable-iterator对象

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。

  1. import re
  2. p = re.compile(r'\d+')
  3. for m in p.finditer('one1two2three3four4'):
  4. print m.group(),
  5. ### output ###
  6. # 1 2 3 4

6、pattern.sub(repl, string[, count=0]) | re.sub(pattern, repl, string[, count=0])

→ 回字符串对象

返回字符串string的一个拷贝,该串中的所有匹配均被替换成了repl。 当repl是一个字符串时,可以使用 \id \g<id> 、\g<name> 引用分组,但不能使用编号0。 当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。 count默认为0,表示所有的匹配都被替换。如果count大于0时,只有前count个匹配被替换。

如果匹配失败,则返回原string。

  1. import re
  2. p = re.compile(r'(\w+) (\w+)')
  3. s = 'i say, hello world!'
  4. print p.sub(r'\2 \1', s)
  5. def func(m):
  6. return m.group(1).title() + ' ' + m.group(2).title()
  7. print p.sub(func, s)
  8. ### output ###
  9. # say i, world hello!
  10. # I Say, Hello World!

7、pattern.subn(repl, string[, count]) |re.subn(pattern, repl, string[, count])

→ 回tuple对象

subn 与 sub 相同, 只是 subn 返回一个元组 (new_string, n) ,这里 n 是替换的个数

如果匹配失败,返回tuple对象,new_string值为原字符串string,n值为0

  1. import re
  2. p = re.compile(r'(\w+) (\w+)')
  3. s = 'i say, hello world!'
  4. print p.subn(r'\2 \1', s)
  5. def func(m):
  6. return m.group(1).title() + ' ' + m.group(2).title()
  7. print p.subn(func, s)
  8. ### output ###
  9. # ('say i, world hello!', 2)
  10. # ('I Say, Hello World!', 2)

未完待续

参考文献

1、http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

2、http://docs.python.org/howto/regex

3、http://docs.python.org/library/re.html

4、http://www.cnblogs.com/john2000/archive/2010/08/02/1790335.html

5、http://www.jb51.net/article/15707.htm

6、http://blog.csdn.net/eroswang/article/details/1677782

 

python正则表达式——re模块的更多相关文章

  1. python正则表达式Re模块备忘录

    title: python正则表达式Re模块备忘录 date: 2019/1/31 18:17:08 toc: true --- python正则表达式Re模块备忘录 备忘录 python中的数量词为 ...

  2. Python面试题之Python正则表达式re模块

    一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...

  3. Python 正则表达式——re模块介绍

    Python 正则表达式 re 模块使 Python 语言拥有全部的正则表达式功能,re模块常用方法: re.match函数 re.match从字符串的起始位置匹配,如果起始位置匹配不成功,则matc ...

  4. python 正则表达式re模块

    #####################总结##############    优点:  灵活, 功能性强, 逻辑性强.               缺点:  上手难,旦上手, 会爱上这个东西    ...

  5. python正则表达式re模块详细介绍--转载

    本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆( ...

  6. python正则表达式-re模块的爱恨情仇

    利用python的re模块,使用正则表达式对字符串进行处理 # 编辑者:闫龙 import re restr = "abccgccc123def456ghi789jgkl186000&quo ...

  7. python正则表达式-re模块

    目录: 一.正则函数 二.re模块调用 三.贪婪模式 四.分组 五.正则表达式修饰符 六.正则表达式模式 七.常见的正则表达式 导读: 想要使用python的正则表达式功能就需要调用re模块,re模块 ...

  8. python -- 正则表达式&re模块(转载)

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  9. Python正则表达式re模块学习遇到的问题

    Python正则表达式处理的组是什么? Python正则表达式处理中的匹配对象是什么? Python匹配对象的groups.groupdict和group之间的关系 Python正则表达式re.mat ...

随机推荐

  1. 10 个非常有用的 AngularJS 框架

    AngularJS是最流行的开源web app框架.AngularJS被用于解决阻碍单页应用程序开发的各种挑战. 你作为一个AngularJS用户,却不知道一些可以帮助你美化编码的资源?那么一定不能错 ...

  2. Android实现Http协议案例

    在Android开发中,使用Http协议实现网络之间的通信是随处可见的,使用http方式主要采用2中请求方式即get和post两种方式. 一.使用get方式: HttpGet httpGet = ne ...

  3. ubuntu设置关闭屏幕和锁定

    见链接:http://askubuntu.com/questions/177348/how-do-i-disable-the-screensaver-lock If you want to wrap ...

  4. 《shell脚本if..then..elif..then.if语句的总结》

    第一种: #!/bin/bash service vsftpd start &> /dev/null if [ $? -eq 0 ] then echo "ftp is sta ...

  5. linux传送文件至服务器

    scp安全文件拷贝(基于ssh的登陆)     1.你想把本地/home下的文件linux.tar.gz传送至远端服务器10.108.125.30,远端服务器的账号名为name,保存至服务器/home ...

  6. 利用Apply的参数数组化来提高代码的优雅性,及高效性

    利用Apply的参数数组化来提高代码的优雅性,及高效性 Function.apply()在提升程序性能方面的技巧 我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所 ...

  7. getMeasuredHeight() 与 getHeight() 的区别

    http://www.cnblogs.com/x-dev/p/3767538.html?utm_source=tuicool&utm_medium=referral public final ...

  8. Delphi XE5教程5:程序的结构和语法

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  9. WPF 气泡尖角在左边、下面、右边、上面

    由于项目需要,在弄一个气泡提示框,根据网上资料,使用Path可以将气泡画出来,下面是我画出来的. 1.气泡尖角在左边的: <Path Stroke="Black" Strok ...

  10. SQLserver中的xp_cmdshell

    shell是用户与操作系统对话的一个接口,通过shell告诉操作系统让系统执行我们的指令 xp_cmdshell在sqlserver中默认是关闭的存在安全隐患. --打开xp_cmdshell ;;R ...