Python's Archiver

為方便港臺同胞閱覽,Python中國特別推出簡繁體內容轉換功能

zkfarmer 发表于 2008-11-20 11:14

4.2.6 例子

模拟 scanf()

当前Python没有一个相当于 scanf()。 正则表达式通常更强大,但也更详细,比 scanf() 格式串。下面的表格提供了 scanf() 格式标记和正则表达式之间大体上的一些相当的映射。

scanf() 标记                      正则表达式
%c                                      .
%5c                              .{5}
%d                                      [-+]?\d+
%e, %E, %f, %g              [-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?
%i                                      [-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)
%o                                      0[0-7]*
%s                                      \S+
%u                                      \d+
%x, %X                              0[xX][\dA-Fa-f]+

从字符串中提取文件名和数字,像这样

    /usr/sbin/sendmail - 0 errors, 4 warnings

你使用scanf()格式,像这样

    %s - %d errors, %d warnings

相当的正则表达式应该是

    (\S+) - (\d+) errors, (\d+) warnings

避免递归

如果你创建需要引擎执行大量递归的正则表达式,你可能遇到一个带有最大递归限制超出的信息的RuntimeError异常。例如,

>>> import re
>>> s = 'Begin ' + 1000*'a very long string ' + 'end'
>>> re.match('Begin (\w| )*? end', s).end()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/local/lib/python2.5/re.py", line 132, in match
    return _compile(pattern, flags).match(string)
RuntimeError: maximum recursion limit exceeded

你可以经常重构你的正则表达式避免递归。

Python 2.3开始,*? 模式的简单使用被特殊封装来避免递归。因此,上面的正则表达式可以通过改换为Begin [a-zA-Z0-9_ ]*?end来避免递归。更多的好处,如正则表达式将比它们递归的等价物运行的更快。
[color=Red]
出处[url=http://www.okpython.com]Python中国[/url],由zkfarmer翻译整理,更详细的文档以及提交错误和建议在[url=http://www.zkfarmer.org]这里[/url]。[/color]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.