#u2076和u2084分别是上标的6和下标的4,属于unicode的DIGIT
>>> unistr = u'u2076u2084abc'
>>> print unistr
⁶₄abc
>>> print re.findall('d+', unistr, re.U)[0]
⁶₄
D
和d相反,不多说了。
s
当未指定UNICODE和LOCALE这两个标志位时,匹配任何空白字符,等效于[ tnrfv]。如果指定了LOCALE,则还要加LOCALE相关的空白字符;如果指定了UNICODE,还要加上UNICODE空白字符,如较常见的空宽度连接空格(uFEFF)、零宽度非连接空格(u200B)等。
S
和s相反,也不多说。
w
当未指定UNICODE和LOCALE这两个标志位时,等效于[a-zA-Z0-9_]。当指定了LOCALE时,为[0-9_]加上当前LOCAL指定的字母。当指定了UNICODE时,为[0-9_]加上UNICODE库里的所有字母。
W
和w相反,不多说。
Z
只匹配字符串的结尾。
匹配之搜索
python提供了两种基于正则表达式的操作:匹配(match)从字符串的开始检查字符串是否个正则匹配。而搜索(search)检查字符串任意位置是否有匹配的子串(perl默认就是如此)。
注意,即使search的正则以'^'开头,match和search也还是有许多不同的。
>>> re.match("c", "abcdef") # 不匹配
>>> re.search("c", "abcdef") # 匹配
<_sre.SRE_Match object at ...>
模块的属性和方法
re.compile(pattern[, flags])
把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法。
得到的正则对象的行为(也就是模式)可以用flags来指定,值可以由几个下面的值OR得到。
以下两段内容在语法上是等效的:
prog = re.compile(pattern)
result = prog.match(string)
result = re.match(pattern, string)
区别是,用了re.compile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候,效率会有较大的提升。再用上面用过的例子来演示一下,用相同的正则匹配相同的字符串,执行100万次,就体现出compile的效率了(数据来自我那1.86G CPU的神舟本本):
>>> timeit.timeit(
... setup='''import re; reg = re.compile('<(?P<tagname>w*)>.*</(?P=tagname)>')''',
... stmt='''reg.match('<h1>xxx</h1>')''',
... number=1000000)
1.2062149047851562
>>> timeit.timeit(
... setup='''import re''',
... stmt='''re.match('<(?P<tagname>w*)>.*</(?P=tagname)>', '<h1>xxx</h1>')''',
... number=1000000)
4.4380838871002197










