为了账号安全,请及时绑定邮箱和手机立即绑定

是否值得使用Python的re.编译?

是否值得使用Python的re.编译?

茅侃侃 2019-07-12 16:49:27
是否值得使用Python的re.编译?在Python中使用用于正则表达式的编译有什么好处吗?h = re.compile('hello')h.match('hello world')VSre.match('hello', 'hello world')
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

对我来说,最大的好处是re.compile能够将正则表达式的定义与它的使用分开。

甚至一个简单的表达式,比如0|[1-9][0-9]*(基数10中没有前导零的整数)可能足够复杂,因此您宁愿不必重新键入它,检查是否输入了任何类型,然后在开始调试时必须重新检查是否有排字。另外,使用变量名(如num或num_b10)比使用变量名要好得多0|[1-9][0-9]*.

当然可以存储字符串并将它们传递给re.Match;但是,这是较少可读性:

num = "..."# then, much later:m = re.match(num, input)

相对于汇编:

num = re.compile("...")# then, much later:m = num.match(input)

虽然它是相当接近,第二行感觉更自然和简单的重复使用。


查看完整回答
反对 回复 2019-07-12
?
守着一只汪

TA贡献1872条经验 获得超3个赞

FWIW:

$ python -m timeit -s "import re" "re.match('hello', 'hello world')"100000 loops, best of 3: 3.82 usec per loop

$ python -m timeit -s "import re; h=re.compile('hello')" "h.match('hello world')"1000000 loops, best of 3: 1.26 usec per loop

所以,如果要使用很多事,也许值得去做re.compile(特别是对于更复杂的正则表达式)。

反对过早优化的标准论点是适用的,但我认为您不会因为使用re.compile如果您怀疑您的regexp可能成为性能瓶颈。

最新情况:

在Python3.6(我怀疑上面的时间是使用Python2.x完成的)和2018硬件(MacBookPro)下,我现在得到了以下时间:

% python -m timeit -s "import re" "re.match('hello', 'hello world')"1000000 loops, best of 3: 
0.661 usec per loop% python -m timeit -s "import re; h=re.compile('hello')" "h.match('hello world')"1000000 loops, best of 3:
 0.285 usec per loop% python -m timeit -s "import re" "h=re.compile('hello'); h.match('hello world')"1000000 loops, best of 3:
  0.65 usec per loop% python --versionPython 3.6.5 :: Anaconda, Inc.

我还添加了一个大小写(注意前两次运行之间的引号差异),它表明re.match(x, ...)从字面上[大致]相当于re.compile(x).match(...)也就是说,编译后表示的幕后缓存似乎不会发生。


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 652 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信