本文共 6632 字,大约阅读时间需要 22 分钟。
今天学习python的正则表达式
参考了这篇博文http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
以及菜鸟教程,用来以后的复习
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
1、首先是正则表达式匹配的流程
下面是python支持的正则表达式支持的元字符和语法
对上面这张图片的注释:
①默认情况下,不会匹配换行符,但设置dotall模式后,就会匹配包括换行符在内的所有字符1.1数量词的贪婪模式和非贪婪模式
例如:正则表达式“ab”,如果用于查找“abbbc”,将会找到“abbb”。而如果使用非贪婪的数量词“ab*?”,将会找到“a”。
1.2反斜杠的空扰
python中可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。
2、re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
①
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
②
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)以下是一个实例
# encoding: UTF-8import re # 将正则表达式编译成Pattern对象pattern = re.compile(r'hello') # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回Nonematch = pattern.match('hello world!') if match: # 使用Match获得分组信息 print match.group() ### 输出 #### hellore.compile(strPattern[,flag])
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。
可选值有:
a = re.compile(r"""\d + # the integral part \. # the decimal point \d * # some fractional digits""", re.X)b = re.compile(r"\d+\.\d*")re提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,但同时也无法复用编译后的Pattern对象。这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为:
m = re.match(r'hello', 'hello world!')print m.group()re模块还提供了一个方法 escape(string),用于将string中的正则表达式元字符如*/+/?等之前加上转义符再返回,在需要大量匹配元字符时有那么一点用。 2.1 Match
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
属性:
方法:
import rem = re.match(r'(\w+) (\w+)(?P.*)', 'hello world!') print "m.string:", m.stringprint "m.re:", m.reprint "m.pos:", m.posprint "m.endpos:", m.endposprint "m.lastindex:", m.lastindexprint "m.lastgroup:", m.lastgroup print "m.group(1,2):", m.group(1, 2)print "m.groups():", m.groups()print "m.groupdict():", m.groupdict()print "m.start(2):", m.start(2)print "m.end(2):", m.end(2)print "m.span(2):", m.span(2)print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3') ### output #### m.string: hello world!# m.re: <_sre.SRE_Pattern object at 0x016E1A38># m.pos: 0# m.endpos: 12# m.lastindex: 3# m.lastgroup: sign# m.group(1,2): ('hello', 'world')# m.groups(): ('hello', 'world', '!')# m.groupdict(): {'sign': '!'}# m.start(2): 6# m.end(2): 11# m.span(2): (6, 11)# m.expand(r'\2 \1\3'): world hello!
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造。
Pattern提供了几个可读属性用于获取表达式的相关信息:
import rep = re.compile(r'(\w+) (\w+)(?P.*)', re.DOTALL) print "p.pattern:", p.patternprint "p.flags:", p.flagsprint "p.groups:", p.groupsprint "p.groupindex:", p.groupindex ### output #### p.pattern: (\w+) (\w+)(?P .*)# p.flags: 16# p.groups: 3# p.groupindex: {'sign': 3}
实例方法[ | re模块方法]:
# encoding: UTF-8 import re # 将正则表达式编译成Pattern对象 pattern = re.compile(r'world') # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None # 这个例子中使用match()无法成功匹配 match = pattern.search('hello world!') if match: # 使用Match获得分组信息 print match.group() ### 输出 ### # world3、split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
import re p = re.compile(r'\d+')print p.split('one1two2three3four4') ### output #### ['one', 'two', 'three', 'four', '']4、findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):
import re p = re.compile(r'\d+')print p.findall('one1two2three3four4') ### output #### ['1', '2', '3', '4']finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
import re p = re.compile(r'\d+')for m in p.finditer('one1two2three3four4'): print m.group(), ### output #### 1 2 3 46、sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
import re p = re.compile(r'(\w+) (\w+)')s = 'i say, hello world!' print p.sub(r'\2 \1', s) def func(m): return m.group(1).title() + ' ' + m.group(2).title() print p.sub(func, s) ### output #### say i, world hello!# I Say, Hello World!7、subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
import re p = re.compile(r'(\w+) (\w+)')s = 'i say, hello world!' print p.subn(r'\2 \1', s) def func(m): return m.group(1).title() + ' ' + m.group(2).title() print p.subn(func, s) ### output #### ('say i, world hello!', 2)# ('I Say, Hello World!', 2)这是一篇优秀的文章,因为浏览次数好评如潮, 本文转自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html