gpt4 book ai didi

python - 正则表达式比使用 .replace() 更快吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:35 25 4
gpt4 key购买 nike

正则表达式会比下面的 Python 代码更快吗?

myStr.replace(","," ").replace("'"," ").replace("-","").replace("_","").replace("["," ").replace("]"," ")

这是否意味着 str 被迭代了 6 次以上(replace() 调用的次数)?正则表达式会更快还是相同的算法/方法?

这个正则表达式是什么样子的?

最佳答案

简答:使用 str.translate,它比标准 Python 发行版中可用的任何替代方法都快。

长答案:

Does this mean that the str is being iterated over 6 times(the number of replace() calls)?

它还可能意味着什么?

What would the regular expression of this look like?

您对 re 文档的哪一部分有疑问?

作为一个可以理解的等价物,试试这个:

"".join(" " if c in ",'-_[]" else c for c in myStr)

或者这个:

cset = set(",'-_[]")
"".join(" " if c in cset else c for c in myStr)

就速度而言,您应该使用与您期望的数据类似的数据进行一些计时。不要忘记在您的字符串中没有此类字符的地方包含一个测试。

更新 以下是实际有效的代码:

>>> import re
>>> myStr = "a,b'c-d_f[g]h"
>>> re.sub(r"[,'\-_[\]]", " ", myStr)
'a b c d f g h'
>>>

更一般地说,为了避免弄清楚哪些字符需要转义,您可以这样做:

>>> badchars = ",'-_[]"
>>> regex = "[" + re.escape(badchars) + "]"
>>> print regex
[\,\'\-\_\[\]]
>>> re.sub(regex, " ", myStr)
'a b c d f g h'
>>>

更新 2 在一个正则表达式中执行 OP 问题似乎要求的内容:

>>> re.sub(r"[,'\-_[\]]", lambda m: "" if m.group(0) in "-_" else " ", myStr)
'a b cdf g h'

更新 3 使用 str.translate

以最快的方式完成 OP 问题似乎要求的操作
# Python 2.X
>>> myStr = "a,b'c-d_f[g]h"
>>> chars2space = ",'[]"
>>> chars2delete = "-_"
>>> table = "".join(" " if chr(i) in chars2space else chr(i) for i in xrange(256))
>>> myStr.translate(table, chars2delete)
'a b cdf g h'

# Python 3.x
>>> myStr = "a,b'c-d_f[g]h"
>>> chars2space = ",'[]"
>>> chars2delete = "-_"
>>> table = dict((ord(c), " ") for c in chars2space)
>>> table.update(dict((ord(c), None) for c in chars2delete))
>>> myStr.translate(table)
'a b cdf g h'
>>>

更新 4 我已经更新了 Blair 的计时器小工具以包含我的严肃解决方案 (str.translate)。以下是我运行标准 win32 Python 2.7.2 的无名英特尔机器的结果:

# input = "a,b'c-d_f[g]h"
String replacement : 0.00000195 seconds per replacement ( 1.00 X)
Borodin: two-regex : 0.00000429 seconds per replacement ( 2.20 X)
John Machin: regex/lambda : 0.00000489 seconds per replacement ( 2.51 X)
John Machin: str.translate : 0.00000042 seconds per replacement ( 0.22 X)

# input *= 100
String replacement : 0.00001612 seconds per replacement ( 1.00 X)
Borodin: two-regex : 0.00015821 seconds per replacement ( 9.82 X)
John Machin: regex/lambda : 0.00036253 seconds per replacement (22.50 X)
John Machin: str.translate : 0.00000424 seconds per replacement ( 0.26 X)

# input *= 1000
String replacement : 0.00012404 seconds per replacement ( 1.00 X)
Borodin: two-regex : 0.00148683 seconds per replacement (11.99 X)
John Machin: regex/lambda : 0.00360127 seconds per replacement (29.03 X)
John Machin: str.translate : 0.00003361 seconds per replacement ( 0.27 X)

# input = "nopunctuation" * 1000 i.e. same length as previous results
String replacement : 0.00002708 seconds per replacement ( 1.00 X)
Borodin: two-regex : 0.00018181 seconds per replacement ( 6.71 X)
John Machin: regex/lambda : 0.00008235 seconds per replacement ( 3.04 X)
John Machin: str.translate : 0.00001780 seconds per replacement ( 0.66 X)

看起来 str.translate 遥遥领先。

关于python - 正则表达式比使用 .replace() 更快吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8958229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com