将替换字符串替换为键并将替换字符串替换为值。蟒蛇
问题描述:
我有一个字典字符串被替换为为keys
及其替换作为值。除了用标记来查看字符串标记外,还有更好/更快的替换方法吗?将替换字符串替换为键并将替换字符串替换为值。蟒蛇
我已经做了这样:
segmenter = {'foobar':'foo bar', 'withoutspace':'without space', 'barbar': 'bar bar'}
sentence = "this is a foobar in a barbar withoutspace"
for i in sentence.split():
if i in segmenter:
sentence.replace(i, segmenter[i])
答
字符串在Python是不可改变的。所以,str.replace
返回一个新的字符串,而不是修改原始字符串。您可以使用str.join()
和列表理解这里:
>>> segmenter = {'foobar':'foo bar', 'withoutspace':'without space', 'barbar': 'bar bar'}
>>> sentence = "this is a foobar in a barbar withoutspace"
>>> " ".join([ segmenter.get(word,word) for word in sentence.split()])
'this is a foo bar in a bar bar without space'
与str.replace
的另一个问题是,它也将与
"abar barb"
更换的话就像"abarbarb"
。
答
re.sub
可以调用返回的替代
segmenter = {'foobar':'foo bar', 'withoutspace':'without space', 'barbar': 'bar bar'}
sentence = "this is a foobar in a barbar withoutspace"
import re
def fn(match):
return segmenter[match.group()]
print re.sub('|'.join(re.escape(k) for k in segmenter), fn, sentence)
+1
+1这比split/get/join方法更具惯用和可控性。 One nit:在构建这样的组合正则表达式时,一定要按键长进行降序排序,以便像“without”这样的较长键不会被像“with”这样的较短键所掩盖。或者,使用“\ b”来定位字边界并防止键之间的混叠。 – 2013-05-13 08:13:49
我问[同样的问题(http://*.com/q/10931150/989121)前一阵子的功能。有一些很好的答案。 – georg 2013-05-13 10:00:51