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]