使用compile加速
compile( rule [,flag] )
将正则规则编译成一个Pattern 对象,以供接下来使用。 第一个参数是规则式,第二个参数是规则选项。 返回一个Pattern 对象 直接使用findall ( rule , target ) 的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了。如果要多次使用同一规则来进行匹配的话,可以使用re.compile 函数来将规则预编译,使用编译过返回的Regular Expression Object 或叫做Pattern 对象来进行查找。 例 >>> s='111,222,aaa,bbb,ccc333,444ddd' >>> rule=r’\b\d+\b’ >>> compiled_rule=re.compile(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=re.compile(r’^\d+’) # 匹配一个位于开头的数字,没有使用M 选项>>> rc.findall(s) ['123'] # 结果只能找到位于第一个行首的’123’ >>> rcm=re.compile(r’^\d+’,re.M) # 使用 M 选项>>> rcm.findall(s) ['123', '789', '345'] # 找到了三个行首的数字同样,对于’$’ 来说,没有使用M 选项,它将匹配最后一个行尾的数字,即’678’ ,加上以后,就能匹配三个行尾的数字456 012 和678 了. >>> rc=re.compile(r’\d+$’) >>> rcm=re.compile(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 = re.compile(r"\d+|[a-zA-Z]+") #匹配一个数字或者单词
使用X 选项写成:
>>> rc = re.compile(r""" # start a rule
\d+ # number
| [a-zA-Z]+ # word
""", re.VERBOSE)
在这个模式下,如果你想匹配一个空格,你必须用'\ '的形式('\'后面跟一个空格)
转载于:https://www.cnblogs.com/wspblog/p/4282698.html