python - 无效操作:[] 在 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'>]
代码有什么问题?
解决方案
有两个问题:
您的正则表达式未正确匹配后缀,仅匹配后缀的第一个字母。
[st|nd|rd|th]
完全匹配括号内的字符之一;重复项被忽略,因此它相当于[st|ndrh]
,|
被视为一个字符来匹配每个字母。改为使用r"(\d+ )(?:st|nd|rd|th)"
;|
非捕获组内部(?:...)
确实可以将4 个模式st
、nd
、rd
和th
.传递给的可调用对象
re.sub
将Match
对象作为其参数。您需要使用它的group
方法来提取捕获的刺。lambda x: num2words.num2words(x.group(1), ordinal=True)
.
推荐阅读
- apache-flink - Flink 作业重启设置被忽略
- python - decompyle3 是否开始提供对 Python 3.9 的支持?
- assembly - 在汇编中将16位值扩展为32位形式以及关于U2代码的问题
- flutter - Flutter 构建设计
- applescript - 有没有办法使用 AppleScript 在 Google Chrome 中暂停 YouTube 视频?
- rust - 如何解决 Rust 中的“无法移动借来的值”(flatbuffers 示例)?
- python - 如何使用 MYPY 传递关键字参数?
- python - 来自 sklearn 的关于 SVC 对象的 `decision_function_shape` 参数的说明
- fft - 如何在频域中过滤时间序列数据
- postgresql - 如何在 Postgres 函数中使用文本输入作为列名?