Python 使用字典固定长度re.sub

Python 使用字典固定长度re.sub,python,regex,dictionary,Python,Regex,Dictionary,我有一本三个字母长的字典:threeletedict={'abc':'foo','def':'bar','ghi':'ha'…} 现在我需要把一个句子abcdefghi翻译成foobarha。我正在使用re.sub尝试下面的方法,但不知道如何将字典放入其中: p = re.compile('.{3}') # match every three letters re.sub(p,'how to put dictionary here?', "abcdefghi") 谢谢!(无需检查输入长度是否为

我有一本三个字母长的字典:
threeletedict={'abc':'foo','def':'bar','ghi':'ha'…}

现在我需要把一个句子
abcdefghi
翻译成
foobarha
。我正在使用
re.sub
尝试下面的方法,但不知道如何将字典放入其中:

p = re.compile('.{3}') # match every three letters
re.sub(p,'how to put dictionary here?', "abcdefghi")

谢谢!(无需检查输入长度是否为三的倍数)

您可以将任何可调用的内容传递给
re.sub
,因此:

p.sub(lambda m: threeLetterDict[m.group(0)], "abcdefghi")

您可以将任何可调用的内容传递给
re.sub
,因此:

p.sub(lambda m: threeLetterDict[m.group(0)], "abcdefghi")

您可能不需要在此处使用sub:

>>> p = re.compile('.{3}')
>>> ''.join([threeLetterDict.get(i, i) for i in p.findall('abcdefghi')])
'foobarha'

只是另一种解决方案:)。

您可能不需要在此处使用sub:

>>> p = re.compile('.{3}')
>>> ''.join([threeLetterDict.get(i, i) for i in p.findall('abcdefghi')])
'foobarha'

只是一个替代解决方案:)。

一个完全避免重复的解决方案:

threeLetterDict={'abc': 'foo', 'def': 'bar', 'ghi': 'ha'}

threes = map("".join, zip(*[iter('abcdefghi')]*3))

"".join(threeLetterDict[three] for three in threes)
#>>> 'foobarha'

完全避免
re
的解决方案:

threeLetterDict={'abc': 'foo', 'def': 'bar', 'ghi': 'ha'}

threes = map("".join, zip(*[iter('abcdefghi')]*3))

"".join(threeLetterDict[three] for three in threes)
#>>> 'foobarha'

我不熟悉python和lambda,你能解释一下这是怎么回事吗<代码>lambda m:threeLetterDict[m.group(0)]非常感谢@arch1ect:
lambda参数:某些表达式
相当于定义一个函数
def func(参数):返回一些表达式
,然后在使用lambda的任何地方使用它。也就是说,它是一个内联函数。我希望这是有意义的:Dbut
re.sub
需要3个参数,对吗?您不需要传入
p
?@arch1ect:这是
re.sub
的模块级版本,它采用未编译的正则表达式(作为字符串)。您已经编译了一个正则表达式,因此为了利用它,可以对正则表达式对象调用
sub
。请参阅
帮助(re.compile(“”)
。当字符串中有一个不在字典中的三个字母时,它会给出一个错误,因为它不是键。。。如何在lambda中添加if语句以防止在字典中找不到替换?非常感谢。我不熟悉python和lambda,你能解释一下这是怎么回事吗<代码>lambda m:threeLetterDict[m.group(0)]非常感谢@arch1ect:
lambda参数:某些表达式
相当于定义一个函数
def func(参数):返回一些表达式
,然后在使用lambda的任何地方使用它。也就是说,它是一个内联函数。我希望这是有意义的:Dbut
re.sub
需要3个参数,对吗?您不需要传入
p
?@arch1ect:这是
re.sub
的模块级版本,它采用未编译的正则表达式(作为字符串)。您已经编译了一个正则表达式,因此为了利用它,可以对正则表达式对象调用
sub
。请参阅
帮助(re.compile(“”)
。当字符串中有一个不在字典中的三个字母时,它会给出一个错误,因为它不是键。。。如何在lambda中添加if语句以防止在字典中找不到替换?非常感谢。