http://blog.sina.com.cn/s/blog_a15aa56901017liq.html
python详解re模块
(2012-08-06 11:29:01) 正则表达式的元字符有. ^ $ * ? { [ ] | ( )
.表示任意字符
[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。
^ 如果放在字符串的开头,则表示取非的意思。[^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("^a\w+","abcdfa\na1b2c3")
'abcdfa'
>>> m=re.search("^a\w+","abcdfa\na1b2c3",re.MULTILINE),
>>> m.group()
'abcdfa'
我 认为flag设定为re.MULTILINE,根据上面那段话,他也应该匹配换行符之后,所以应该有m.group应该有"a1b2c3",但是结果没 有,用findall来尝试,可以找到结果。所以这里我理解之所以group里面没有,是因为search和match方法是匹配到就返回,而不是去匹配 所有。
>>> m=re.findall("^a\w+",re.MULTILINE)
>>> m
['abcdfa','a1b2c3']
>>> m=re.search("foo.$","foo1\nfoo2\n")
>>> m
<_sre.SRE_Match object at 0x00A27170>
>>> m.group()
'foo2'
>>> m=re.search("foo.$",re.MULTILINE)
>>> m.group()
'foo1'
>>> re.findall("a{5}","aaaaaaaaaa")
['aaaaa','aaaaa']
>>> re.findall("a{5}","aaaaaaaaa")
['aaaaa']
['aaaa','aaaa']
['aa','aa','aa']
>>> re.findall("a{2,4}?",'aa']
元字符“.”在默认模式下,匹配除换行符外的所有字符。在DOTALL模式下,匹配所有字符,包括换行符。
>>> importre
>>> 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+",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]+",'']
>>> re.split("[a-zA-Z]+","0A3b9z")
['0','3','']
>>> re.split('[a-f]+','0a3B9',re.IGNORECASE)#re.IGNORECASE用来忽略pattern中的大小写。
['0','3B9']
如果在split的时候捕获了组,并且匹配字符串的开始,那么返回的结果将会以一个空串开始。
>>> re.split('(\W+)','...words,words...')
['','...','words',','']
>>> re.split('(\W+)',words...')
['words','']
re.findall(pattern,
以list的形式返回string中所有与pattern匹配的不重叠的字符串。String从左向右扫描,匹配的返回结果也是以这个顺序。
Return all non-overlapping matches of
>>> re.findall('(\W+)',words...')
[','...']
>>> re.findall('(\W+)d',words...d')
['...']
>>> re.findall('(\W+)d','...dwords,words...d')
['...','...']
re.finditer(pattern,
与findall类似,只不过是返回list,而是返回了一个叠代器
>>> re.sub("\d","abc1def2hijk","RE")
'RE'
>>> x=re.sub("\d","RE")
>>> x
'RE'
>>> re.sub("\d","RE",)
'abcREdefREhijk'
>>> re.subn("\d",)
('abcREdefREhijk',2)
通过例子我们可以看出sub和subn的差别:sub返回替换后的字符串,而subn返回由替换后的字符串以及替换的个数组成的元组。
re.sub(pattern,
>>> def dashrepl(matchobj):
...if matchobj.group(0) == '-': return ' '
...else: retu
需要转义的字符有:\ . * ^ & [ ] { } ? 等 注意的是如果在[]字符集合里,很多字符都不需要转义 建议你看一下这篇基础教程: http://deerchao.net/tutorials/regex/regex-1.htm
是完全通配的意思,\s是指空白,包括空格、换行、tab缩进等所有的空白,而\S刚好相反 这样一正一反下来,就表示所有的字符,完全的,一字不漏的。 另外,[]这个符号,表示在它里面包含的单个字符不限顺序的出现,比如下面的正则: [ace]* 这表示,只要出现a/c/e这三个任意的字母,都会被匹配 [\s]表示,只要出现空白就匹配 [\S]表示,非空白就匹配 那么它们的组合,表示所有的都匹配,与它相对应的,有[\w\W]等,意义完全相同、 另外要说的一点是,为什么有"."这个通配符了,还要这样的用法。 其实,[\s\S] [\w\W]这样的用法,比较"."所匹配的还要多,因为"."是不会匹配换行的,所有出现有换行匹配的时候,人们就习惯 使用[\s\S]或者[\w\W]这样的完全通配模式。
那么专家再请问一下,为什么我用\s匹配不了换行?只有用[\s\S]才行? 这几天复习没时间。。。让你久等了,等一下我选最佳的时候加分。。