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

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

在Python中使用用于正则表达式的编译有什么好处吗?

h = re.compile('hello')h.match('hello world')

VS

re.match('hello', 'hello world')


茅侃侃
浏览 659回答 3
3回答

HUX布斯

对我来说,最大的好处是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)虽然它是相当接近,第二行感觉更自然和简单的重复使用。

守着一只汪

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(...)也就是说,编译后表示的幕后缓存似乎不会发生。
打开App,查看更多内容
随时随地看视频慕课网APP