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.
给定一个字符串和一个字符字典,返回这个字符串的副本,要求其中的特定字串替换为字典中对应的字符串.
讨论:
在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.
标签: Python