Python正则表达式模块re讲解.doc
文本预览下载声明
2 re模块的基本函数
在上面的说明中,我们已经对re模块的基本函数?‘findall’很熟悉了。当然如果光有findall的话,很多功能是不能实现的。下面开始介绍一下re模块其它的常用基本函数。灵活搭配使用这些函数,才能充分发挥Python正则式的强大功能。
首先还是说下老熟人findall函数吧
findall(rule , target [,flag] )
在目标字符串中查找符合规则的字符串。
第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项(选项功能将在compile函数的说明中详细说明)。
返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。
2.1?使用compile加速
compile( rule [,flag] )
将正则规则编译成一个Pattern对象,以供接下来使用。
第一个参数是规则式,第二个参数是规则选项。
返回一个Pattern对象
直接使用findall ( rule , target )的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了。如果要多次使用同一规则来进行匹配的话,可以使用pile函数来将规则预编译,使用编译过返回的Regular Expression Object或叫做Pattern对象来进行查找。
s=111,222,aaa,bbb,ccc333,444ddd
rule=r’\b\d+\b’
compiled_rule=pile(rule)
compiled_rule.findall(s)
[111, 222]
可见使用compile过的规则使用和未编译的使用很相似。compile函数还可以指定一些规则标志,来指定一些特殊选项。多个选项之间用?’|’(位或)连接起来。
I??????IGNORECASE?忽略大小写区别。
?
L???LOCAL??字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配é?或??。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
?
M????MULTILINE??多行匹配。在这个模式下’^’(代表字符串开头)和’$’(代表字符串结尾)将能够匹配多行的情况,成为行首和行尾标记。比如
s=’123 456\n789 012\n345?678’
rc=pile(r’^\d+’)????#匹配一个位于开头的数字,没有使用M选项
rc.findall(s)
[123]?????????????#结果只能找到位于第一个行首的’123’
rcm=pile(r’^\d+’,re.M)???????#使用?M?选项
rcm.findall(s)
[123, 789, 345]??#找到了三个行首的数字
同样,对于’$’来说,没有使用M选项,它将匹配最后一个行尾的数字,即’678’,加上以后,就能匹配三个行尾的数字456 012和678了.
rc=pile(r’\d+$’)
rcm=pile(r’\d+$’,re.M)
rc.findall(s)
[678]
rcm.findall(s)
[456, 012, 678]
?
S?????DOTALL???????‘.’号将匹配所有的字符。缺省情况下’.’匹配除换行符’\n’外的所有字符,使用这一选项以后,’.’就能匹配包括’\n’的任何字符了。
?
U???UNICODE???????\w,?\W,?\b,?\B,?\d,?\D,?\s?和?\S都将使用Unicode。
?
X?????VERBOSE?????这个选项忽略规则表达式中的空白,并允许使用’#’来引导一个注释。这样可以让你把规则写得更美观些。比如你可以把规则
rc = pile(r\d+|[a-zA-Z]+)?????? #匹配一个数字或者单词
使用X选项写成:
rc = pile(r? # start a rule
\d+????? ??? ???????? # number
| [a-zA-Z]+?? ??????? # word
, re.VERBOSE)
在这个模式下,如果你想匹配一个空格,你必须用\ 的形式(\后面跟一个空格) ?
?
2.2 match与search
match( rule , targetString [,flag] )
search( rule , targetString [,flag] )
(注:re的match?与search函数同compile过的Pat
显示全部