php - 在 Python 中进行多个字符串替换的最快实现

标签 php python string

除了在字符串上执行 replace 链接(即 text.replace(a, b).replace(c, d).replace 之外,是否有任何推荐的方法来执行多个字符串替换(e, f)...)? 例如,您将如何在 Python 中实现一个行为类似于 PHP 的 htmlspecialchars 的快速函数?

我比较了 (1) 多个 replace 方法,(2) 正则表达式方法,以及 (3) Matt Anderson 的方法。

运行 n=10 次后,结果如下:

在 100 个字符上:

TIME: 0 ms [ replace_method(str) ]
TIME: 5 ms [ regular_expression_method(str, dict) ]
TIME: 1 ms [ matts_multi_replace_method(list, str) ]

在 1000 个字符上:

TIME: 0 ms [ replace_method(str) ]
TIME: 3 ms [ regular_expression_method(str, dict) ]
TIME: 2 ms [ matts_multi_replace_method(list, str) ]

在 10000 个字符上:

TIME: 3 ms [ replace_method(str) ]
TIME: 7 ms [ regular_expression_method(str, dict) ]
TIME: 5 ms [ matts_multi_replace_method(list, str) ]

在 100000 个字符上:

TIME: 36 ms [ replace_method(str) ]
TIME: 46 ms [ regular_expression_method(str, dict) ]
TIME: 39 ms [ matts_multi_replace_method(list, str) ]

在 1000000 个字符上:

TIME: 318 ms [ replace_method(str) ]
TIME: 360 ms [ regular_expression_method(str, dict) ]
TIME: 320 ms [ matts_multi_replace_method(list, str) ]

在 3687809 个字符上:

TIME: 1.277524 sec [ replace_method(str) ]
TIME: 1.290590 sec [ regular_expression_method(str, dict) ]
TIME: 1.116601 sec [ matts_multi_replace_method(list, str) ]

非常感谢 Matt 在相当大的输入字符串上击败了多重 replace 方法。

有人知道用更小的弦打败它吗?

最佳答案

也许是像下面这样的东西?将文本拆分为要替换的第一个“来自”项目的部分,然后递归地将每个部分拆分为下一个要替换的“来自”项目的子部分,依此类推,直到您访问了所有替换项.然后在递归函数完成时加入每个替换项的“to”。

也许您很难理解以下代码(它是为我而写的),但它似乎按预期运行。我没有对它进行基准测试,但我怀疑它会相当快。

def multi_replace(pairs, text):
    stack = list(pairs)
    stack.reverse()
    def replace(stack, parts):
        if not stack:
            return parts
        # copy the stack so I don't disturb parallel recursions
        stack = list(stack) 
        from_, to = stack.pop()
        #print 'split (%r=>%r)' % (from_, to), parts
        split_parts = [replace(stack, part.split(from_)) for part in parts]
        parts = [to.join(split_subparts) for split_subparts in split_parts]
        #print 'join (%r=>%r)' % (from_, to), parts
        return parts
    return replace(stack, [text])[0]


print multi_replace(
    [('foo', 'bar'), ('baaz', 'foo'), ('quux', 'moop')], 
    'foobarbaazfooquuxquux')

对于:

barbarfoobarmoopmoop

关于php - 在 Python 中进行多个字符串替换的最快实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411006/

相关文章:

php - 找不到 CodeIgniter 对象 只有索引函数有效

python - 在 spaCy 管道中对自定义组件进行基准测试的最佳方法是什么?

python - pylint 和 abc - 抽象方法

string - 如何在 Dart 中反转包含代理对的字符串?

php - 为什么我没有滚动条?

php - PHP 5.3.x 和 PHP 5.2.x 之间有什么区别,我应该使用哪一个?

java - Android,并创建一个非常简单的数据库

python - Django - 查询集以获取模型的所有相关详细信息

c - 如何将 char 字符串从另一个函数复制到 main?

javascript - 选择字符串中的特定字符并使用 Jquery(视觉上)对其进行偏移