InvalidOperation:Lambda 函数中的 [<class 'decimal.ConversionSyntax'>] python

InvalidOperation: [<class 'decimal.ConversionSyntax'>] in Lambda function python

我有一个包含纯数字和序数的句子,我想将序数转换为诸如 2 nd 到 Second、56 th 到 Fifty sixth 之类的词。 我使用了 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'>]

代码有什么问题?

有两个问题:

  1. 您的正则表达式未正确匹配后缀,仅匹配后缀的第一个字母。 [st|nd|rd|th] 正好匹配括号内的一个字符;重复项将被忽略,因此它等同于 [st|ndrh],其中 | 被视为要像每个字母一样匹配的字符。使用 r"(\d+ )(?:st|nd|rd|th)" 代替;非捕获组 (?:...) 中的 | 确实 用于分隔 4 种模式 stndrd, 和 th.

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