2007-06-20

 

Python Cookbook 1.16 在字符串中进行插值和替换

需求:

给定一个字符串和一个字符字典,返回这个字符串的副本,要求其中的特定字串替换为字典中对应的字符串.

讨论:

在Python2.3以后,可以使用以下的代码来实现这个功能:

def expand(format, d, marker='"', safe=False):
    if safe:
        def lookup(w): return d.get(w, w.join(marker*2))
    else:
        def lookup(w): return d[w]
    parts = format.split(marker)
    parts[1::2] = map(lookup, parts[1::2])
    return ''.join(parts)
if _ _name_ _ == '_ _main_ _':
    print expand('just "a" test', {'a': 'one'})
# emits: just one test

当safe参数为False时,给定的marker必须在字典d中存在,否则要抛出KeyError异常.当safe参数的值为True时,marker如果在字典d中不存在,依然保留原值.

在上面的expand方法中,有几点是要注意的.它定义了两个内嵌函数,而且取决于safe的值是否为True.如果safe为false,它只是返回了字典的中的项,如果不存在,就会抛出KeyError异常.如果safe为True ,使用字典的get方法,如果键不存在,就返回原值.如果想用别的形式返回,用mark+w+mark也是mark*2的可选替换方案.

在上面的代码中,我们也遵循了Python字符串处理的"分割/处理/合并"原则,在处理过程中,它总是处理偶数索引的片段.这样保证是处于""中间的字串.

另外,也可以使用string.Template来实现这个需求,可以参考相关章节.

相关说明:

dict.get(...)
    D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.


标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?