Python 哪个正则表达式更有效?

Python 哪个正则表达式更有效?,python,regex,Python,Regex,哪个更有效?有没有其他方法可以提高效率?请注意,尽管我使用了Perl风格的语法进行说明,但实际上我使用的是Python的re库,它不允许使用\K(keep)关键字。(?p\[\[foo[^\[])abc在Python中使用re模块要快得多: s/(?=\[\[foo[^\[]*)abc/def 编辑(在同一循环中执行两个调用时再运行几次): 产出: import time import re rec1 = re.compile('(?P<head>\[\[foo[^\[]*)a

哪个更有效?有没有其他方法可以提高效率?请注意,尽管我使用了Perl风格的语法进行说明,但实际上我使用的是Python的
re
库,它不允许使用
\K
(keep)关键字。

(?p\[\[foo[^\[])abc
在Python中使用
re
模块要快得多:

s/(?=\[\[foo[^\[]*)abc/def

编辑(在同一循环中执行两个调用时再运行几次): 产出:

import time
import re

rec1 = re.compile('(?P<head>\[\[foo[^\[]*)abc')
rec2 = re.compile('(?=\[\[foo[^\[]*)abc')

total1, total2 = 0.0, 0.0

def timeRE(ver):
    x = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" * 100)
    t1 = time.time()
    if ver is 1:
        rec1.sub("def", x)
    else:
        rec2.sub("def", x)
    return (time.time() - t1)

for x in xrange(50000):
    total1 += timeRE(1)

for x in xrange(50000):
    total2 += timeRE(2)

print total1
print total2
for x in xrange(50000):
    total1 += timeRE(1)
    total2 += timeRE(2)

编辑(固定子项以匹配问题):
编辑(使用与正则表达式匹配的字符串):
最后一次是:
您可能需要执行大约10000个左右的正则表达式和基准测试。很难猜测这些事情,因为每个正则表达式引擎实现都有自己的优缺点。您可以使用timeit模块()找出哪个更快。就查询所需时间而言,效率更高?这取决于您搜索的内容,您能举个例子吗?仅供参考:这些正则表达式不会做相同的事情(事实上,第二个正则表达式永远不会匹配任何东西。)请参阅:@kudu只是一个友好的提醒-如果您觉得有人对您有所帮助或回答了问题,最好接受一个答案。这样做会增加其他人回答您将来可能遇到的问题的可能性。我想给您+1,但是
rec1.sub(“def”,x)
应该是
rec1.sub(\gdef,x)
基于OP。你能用正确的替换项重新运行吗?仍然不正确。需要
\gdef
而不是
\g
,尽管我猜这不会影响时间,因为正则表达式永远不会匹配,所以永远不会进行任何替换。@jacob我刚刚注意到我自己,修复好了,你已经得到了+1,但仅供参考,第二个正则表达式(由于OP的错误,而不是您的错误)将永远不会匹配任何内容,因此不会进行任何替换。这是因为它正在查找
[[foo
然后尝试匹配
abc
。查找可以修复此问题,但不允许使用可变长度查找。出于好奇,请使用
(?)重试?
4.27380466461
16.9591507912
for x in xrange(50000):
    total1 += timeRE(1)
    total2 += timeRE(2)
4.26199269295
17.2384319305
import time
import re
rec1 = re.compile('(?P<head>\[\[foo[^\[]*)abc')
rec2 = re.compile('(?=\[\[foo[^\[]*)abc')
total1, total2 = 0.0, 0.0
def timeRE(ver):
    x = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" * 100)
    t1 = time.time()
    if ver is 1:
        rec1.sub("\g<head>def", x)
    else:
        rec2.sub("def", x)
    return (time.time() - t1)

for x in xrange(50000):
    total1 += timeRE(1)
    total2 += timeRE(2)
print total1
print total2
Run 1:
4.62282061577
17.8212277889

Run 2:    
4.6660721302
17.1630160809

Run 3:
4.62124109268
17.21393013
import time
import re

rec1 = re.compile('(?P<head>\[\[foo[^\[]*)abc')
rec2 = re.compile('(?=\[\[foo[^\[]*)abc')
total1, total2 = 0.0, 0.0

def timeRE(ver):
    x = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890_<head>_<tail>_</head>_</tail>_abcdefghijklmnopqrstuvwxyz_<head>[[fooBAR_ABCDEFGHIJKLMNOPQRSTUVWXYZ_abc]]]]defghiojklmnopqrstuvwyz" * 100)
    t1 = time.time()
    if ver is 1:
        rec1.sub("\g<head>def", x)
    else:
        rec2.sub("def", x)
    return (time.time() - t1)

for x in xrange(50000):
    total1 += timeRE(1)
    total2 += timeRE(2)

print total1
print total2
23.4271130562
29.6934807301
import time
import re
rec1 = re.compile('(?P<head>\[\[foo[^\[]*)abc')
rec2 = re.compile('(?=\[\[foo[^\[]*)abc')
total1, total2 = 0.0, 0.0
def timeRE(ver):
    x = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890_<head>_<tail>_</head>_</tail>_abcdefghijklmnopqrstuvwxyz_<head>[[fooBAR_ABCDEFGHIJKLMNOPQRSTUVWXYZ_abc]]]]defghiojklmnopqrstuvwyz" * 100)
    t1 = time.time()
    if ver is 1:
        rec1.sub("\g<head>def", x)
    else:
        rec2.sub("def", x)
    return (time.time() - t1)
for x in xrange(50000):
    total1 += timeRE(1)
    total2 += timeRE(2)
print "Method 1: Avg run took: %+0.7f - With a total of: %+0.7f" % ((total1 / 50000.0), total1)
print "Method 2: Avg run took: %+0.7f - With a total of: %+0.7f" % ((total2 / 50000.0), total2)
Method 1: Avg run took: +0.0004924 - With a total of: +24.6196477
Method 2: Avg run took: +0.0005921 - With a total of: +29.6053855