python正则表达式re模块详细介绍

2019-10-06 15:42:42刘景俊


#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