3

我有一个元组列表,每个元组都包含一个我想应用于字符串的查找/替换值。这样做最有效的方法是什么?我将迭代地应用它,所以性能是我最关心的问题。

更具体地说,processThis() 的内部结构是什么样的?

x = 'find1, find2, find3'
y = [('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')]

def processThis(str,lst):
     # Do something here
     return something

>>> processThis(x,y)
'replace1, replace2, replace3'

谢谢大家!

4

5 回答 5

6

您可以考虑使用re.sub

import re
REPLACEMENTS = dict([('find1', 'replace1'),
                     ('find2', 'replace2'),
                     ('find3', 'replace3')])

def replacer(m):
    return REPLACEMENTS[m.group(0)]

x = 'find1, find2, find3'
r = re.compile('|'.join(REPLACEMENTS.keys()))
print r.sub(replacer, x)
于 2009-07-24T02:55:05.307 回答
1

几点注意事项:

  1. 关于过早优化、基准测试、瓶颈、100 的样板参数很小等。
  2. 在某些情况下,不同的解决方案将返回不同的结果。如果y = [('one', 'two'), ('two', 'three')]然后x = 'one'mhawke 的解决方案给了你'two',而 Unknown 的给了'three'.
  3. 在一个愚蠢的人为示例中测试这一点 mhawke 的解决方案要快一点。不过,用您的数据进行尝试应该很容易。
于 2009-07-24T03:40:13.850 回答
0
x = 'find1, find2, find3'
y = [('find1', 'replace1'), ('find2', 'replace2'), ('find3', 'replace3')]

def processThis(str,lst):
    for find, replace in lst:
        str = str.replace(find, replace)

    return str

>>> processThis(x,y)
'replace1, replace2, replace3'
于 2009-07-24T02:53:08.990 回答
0
s = reduce(lambda x, repl: str.replace(x, *repl), lst, s)
于 2009-07-24T03:05:45.990 回答
0

与 mhawke 相同的答案,包含方法 str_replace

def str_replace(data, search_n_replace_dict):
    import re
    REPLACEMENTS = search_n_replace_dict

    def replacer(m):
        return REPLACEMENTS[m.group(0)]

    r = re.compile('|'.join(REPLACEMENTS.keys()))
    return r.sub(replacer, data)

然后我们可以用下面的例子调用这个方法

s = "abcd abcd efgh efgh;;;;;; lkmnkd kkkkk"
d = dict({ 'abcd' : 'aaaa', 'efgh' : 'eeee', 'mnkd' : 'mmmm' })


print (s)
print ("\n")
print(str_replace(s, d))

输出 :

abcd abcd efgh efgh;;;;;; lkmnkd kkkkk


aaaa aaaa eeee eeee;;;;;; lkmmmm kkkkk
于 2016-07-08T06:57:41.463 回答