] 在 Lambda 函数 python,python,function,lambda"/>

首页 > 解决方案 > 无效操作:[] 在 Lambda 函数 python

问题描述

我有一个带有普通数字和序数的句子,我想将序数转换为诸如 2 nd 到 Second、56 th 到 56 th 之类的词。我使用了库 num2words,下面的代码完美运行。

import num2words
text = "ordinal numbers are like as 42 nd, 67 th, and 5 th and plain numbers such as 1, 2, 3."
numbers = re.findall('(\d+ )[st|nd|rd|th]', text)
numbers
for n in numbers:
    ordinalAsString = num2words.num2words(n, ordinal=True)
    print(ordinalAsString)
    #forty-second
    #sixty-seventh
    #fifth

现在我想创建一个 lambda 函数,这样,

sentence = "ordinal numbers are like as 42 nd, 67 th, and 5 th and plain numbers such as 1, 2, 3."
o/p sentence = "ordinal numbers are like as fourty-second, sixty-seventh, and fifth and plain numbers such as 1, 2, 3."

我写了这样的函数,

sentence = re.sub(r"(\d+ )[st|nd|rd|th]", lambda x: num2words.num2words(str(x), ordinal=True), sentence)

但这会引发错误,例如,

InvalidOperation: [<class 'decimal.ConversionSyntax'>]

代码有什么问题?

标签: pythonfunctionlambda

解决方案


有两个问题:

  1. 您的正则表达式未正确匹配后缀,仅匹配后缀的第一个字母。[st|nd|rd|th]完全匹配括号内的字符之一;重复项被忽略,因此它相当于[st|ndrh],|被视为一个字符来匹配每个字母。改为使用r"(\d+ )(?:st|nd|rd|th)"|非捕获组内部(?:...) 确实可以将4 个模式stndrdth.

  2. 传递给的可调用对象re.subMatch对象作为其参数。您需要使用它的group方法来提取捕获的刺。 lambda x: num2words.num2words(x.group(1), ordinal=True).


推荐阅读