[转载]python 详解re模块
正则表达式的元字符有. ^ $ * ? {
[ ] | ( )
.表示任意字符
[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。
^ 如果放在字符串的开头,则表示取非的意思。[^5]表示除了5之外的其他字符。而如果^不在字符串的开头,则表示它本身。
具有重复功能的元字符:
* 对于前一个字符重复0到无穷次
对于前一个字符重复1到无穷次
?对于前一个字符重复0到1次
{m,n} 对于前一个字符重复次数在为m到n次,其中,{0,} = *,{1,} = , {0,1} = ?
{m} 对于前一个字符重复m次
d 匹配任何十进制数;它相当于类 [0-9]。
D 匹配任何非数字字符;它相当于类 [^0-9]。
s 匹配任何空白字符;它相当于类 [ fv]。
S 匹配任何非空白字符;它相当于类 [^ fv]。
w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
正则表达式(可以称为REs,regex,regex pattens)是一个小巧的,高度专业化的编程语言,它内嵌于python开发语言中,可通过re模块使用。正则表达式的
pattern可以被编译成一系列的字节码,然后用C编写的引擎执行。下面简单介绍下正则表达式的语法
>>> print
m
#验证在元字符[]中,"^"在不同位置所代表的意义。
>>>
re.search("[^abc]","abcd")
<_sre.SRE_Match object at
0x011B19F8>
>>>
m=re.search("[^abc]","abcd")
>>>
m.group()
'd'
>>>
m=re.search("[abc^]","^")
>>>
m.group()
'^'
不过对于元字符”^”有这么一个疑问.官方文档http://docs.python.org/library/re.html有关元字符”^”有这么一句话,Matches the start
of the string, and in
我理解的是”^”匹配字符串的开始,在MULTILINE模式下,也匹配换行符之后。
>>> m=re.search("^aw+","abcdfana1b2c3")
'abcdfa'
>>> m=re.search("^aw+","abcdfana1b2c3",re.MULTILINE),
>>>
m.group()
'abcdfa'
我 认为flag设定为re.MULTILINE,根据上面那段话,他也应该匹配换行符之后,所以应该有m.group应该有"a1b2c3",但是结果没 有,用findall来尝试,可以找到结果。所以这里我理解之所以group里面没有,是因为search和match方法是匹配到就返回,而不是去匹配 所有。
>>> m=re.findall("^aw+","abcdfana1b2c3",re.MULTILINE)
>>> m
['abcdfa', 'a1b2c3']
>>>
m=re.search("foo.$","foo1nfoo2n")
>>> m
<_sre.SRE_Match object at
0x00A27170>
>>>
m.group()
'foo2'
>>>
m=re.search("foo.$","foo1nfoo2n",re.MULTILINE)
>>>
m.group()
'foo1'
>>>
re.findall("a{5}","aaaaaaaaaa")
['aaaaa', 'aaaaa']
>>>
re.findall("a{5}","aaaaaaaaa")
['aaaaa']
['aaaa', 'aaaa']
['aa', 'aa', 'aa', 'aa']
>>>
re.findall("a{2,4}?","aaaaaaaa")
['aa', 'aa', 'aa', 'aa']
元字符“.”在默认模式下,匹配除换行符外的所有字符。在DOTALL模式下,匹配所有字符,包括换行符。
>>> import re
>>> re.match(".","n")
>>> m=re.match(".","n")
>>> print m
None
>>> m=re.match(".","n",re.DOTALL)
>>> print m
<_sre.SRE_Match object at 0x00C2CE20>
>>> m.group()
'n'
下面我们首先来看一下Match Object对象拥有的方法,下面是常用的几个方法的简单介绍
1.group([group1,…])
>>> m=re.match("(w+) (w+)","abcd efgh, chaj")
>>>
m.group()
'abcd efgh'
>>>
m.group(1)
'abcd'
>>> m.group(2)
'efgh'
>>>
m.group(1,2)
('abcd', 'efgh')
>>>
m=re.match("(?P<first_name>w+)
(?P<last_name>w+)","sam
lee")
>>>
m.group("first_name")
'sam'
>>>
m.group("last_name")
'lee'
下面把括号去掉
>>> m=re.match("w+ w+","abcd efgh, chaj")
>>> m.group()
'abcd efgh'
>>> m.group(1)
Traceback (most recent call last):
IndexError: no such group
If a group matches multiple times, only the last match is accessible:
>>> m=re.match(r"(..)+","a1b2c3")
>>> m.group(1)
'c3'
>>> m.group()
'a1b2c3'
Group的默认值为0,返回正则表达式pattern匹配到的字符串
>>> s="afkak1aafal12345adadsfa"
>>> pattern=r"(d)w+(d{2})w"
>>> m=re.match(pattern,s)
>>> print m
None
>>> m=re.search(pattern,s)
>>> m
<_sre.SRE_Match object at 0x00C2FDA0>
>>> m.group()
'1aafal12345a'
>>> m.group(1)
'1'
>>> m.group(2)
'45'
>>> m.group(1,2,0)
('1', '45', '1aafal12345a')
2。groups([default])
返回一个包含所有子组的元组。Default是用来设置没有匹配到组的默认值的。Default默认是"None”,
>>> m=re.match("(d+).(d+)","23.123")
>>> m.groups()
('23', '123')
>>> m=re.match("(d+).?(d+)?","24") #这里的第二个d没有匹配到,使用默认值"None"
>>> m.groups()
('24', None)
>>> m.groups("0")
('24', '0')
3.groupdict([default])
返回匹配到的所有命名子组的字典。Key是name值,value是匹配到的值。参数default是没有匹配到的子组的默认值。这里与groups()方法的参数是一样的。默认值为None
>>> m=re.match("(w+) (w+)","hello world")
>>> m.groupdict()
{}
>>> m=re.match("(?P<first>w+) (?P<secode>w+)","hello world")
>>> m.groupdict()
{'secode': 'world', 'first': 'hello'}
通过上例可以看出,groupdict()对没有name的子组不起作用
正则表达式对象
re.search(string[,
扫描字符串string,查找与正则表达式匹配的位置。如果找到一个匹配就返回一个MatchObject对象(并不会匹配所有的)。如果没有找到那么返回None。
第二个参数表示从字符串的那个位置开始,默认是0
第三个参数endpos限定字符串最远被查找到哪里。默认值就是字符串的长度。.
>>>
m=re.search("abcd", '1abcd2abcd')
>>>
m.group()
'abcd'
>>>
m.start()
1
>>> m.end()
5
>>>
re.findall("abcd","1abcd2abcd")
['abcd', 'abcd']
re.split(pattern,
用pattern来拆分string。如果pattern有含有括号,那么在pattern中所有的组也会返回。
>>> re.split("W+","words,words,works",1)
['words', 'words,works']
>>> re.split("[a-z]","0A3b9z",re.IGNORECASE)
['0A3', '9', '']
>>> re.split("[a-z]+","0A3b9z",re.IGNORECASE)
['0A3', '9', '']
>>> re.split("[a-zA-Z]+","0A3b9z")
['0', '3', '9', '']
>>> re.split('[a-f]+', '0a3B9', re.IGNORECASE)#re.IGNORECASE用来忽略pattern中的大小写。
['0', '3B9']
如果在split的时候捕获了组,并且匹配字符串的开始,那么返回的结果将会以一个空串开始。
>>> re.split('(W+)', '...words, words...')
['', '...', 'words', ', ', 'words', '...', '']
>>> re.split('(W+)', 'words, words...')
['words', ', ', 'words', '...', '']
re.findall(pattern,
以list的形式返回string中所有与pattern匹配的不重叠的字符串。String从左向右扫描,匹配的返回结果也是以这个顺序。
Return all non-overlapping matches of
>>> re.findall('(W+)', 'words, words...')
[', ', '...']
>>> re.findall('(W+)d', 'words, words...d')
['...']
>>> re.findall('(W+)d', '...dwords, words...d')
['...', '...']
re.finditer(pattern,
与findall类似,只不过是返回list,而是返回了一个叠代器
>>> re.sub("d","abc1def2hijk","RE")
'RE'
>>> x=re.sub("d","abc1def2hijk","RE")
>>> x
'RE'
>>> re.sub("d","RE","abc1def2hijk",)
'abcREdefREhijk'
>>> re.subn("d","RE","abc1def2hijk",)
('abcREdefREhijk', 2)
通过例子我们可以看出sub和subn的差别:sub返回替换后的字符串,而subn返回由替换后的字符串以及替换的个数组成的元组。
re.sub(pattern,
>>> def dashrepl(matchobj):
...if matchobj.group(0) == '-': return ' '
...else: retu