You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何简便实现字符串中基数数字转序数数字(自动加后缀)?

Python实现字符串内基数转序数的最简方案

方案1:第三方库实现(代码量最少)

直接调用成熟的num2words库完成转换,无需自己处理序数规则,适配所有常规场景。

安装依赖

pip install num2words

完整实现代码

import re
from num2words import num2words

def cardinal_to_ordinal(text):
    # 正则匹配字符串中所有独立的数字
    def replace_match(match):
        num = int(match.group())
        # 转换为序数并保留数字格式,to='ordinal_num'会直接返回带后缀的数字字符串
        return num2words(num, to='ordinal_num')
    return re.sub(r'\b\d+\b', replace_match, text)

# 测试示例
test_str = 'I was born in September 22 and I am 1 in swimming'
print(cardinal_to_ordinal(test_str))

运行输出为:I was born in September 22nd and I am 1st in swimming

注:你给出的示例中22的输出为22th属于特殊规则,标准序数规则下22对应的后缀为nd,如果需要适配你的自定义规则,可以调整num2words的参数,或者改用下方原生实现自行修改规则。


方案2:无依赖原生实现

如果不想安装第三方库,可以自己实现序数转换逻辑,核心规则如下:

  • 11、12、13后缀统一为th
  • 其余数字按最后一位判断:结尾1用st,结尾2用nd,结尾3用rd,其他情况用th

完整实现代码

import re

def add_ordinal_suffix(num):
    n = int(num)
    if 11 <= n % 100 <= 13:
        suffix = 'th'
    else:
        suffix = {1: 'st', 2: 'nd', 3: 'rd'}.get(n % 10, 'th')
    # 如果你需要把22的后缀改成th适配你的示例,直接修改上面的规则即可
    return f"{n}{suffix}"

def cardinal_to_ordinal(text):
    return re.sub(r'\b\d+\b', lambda m: add_ordinal_suffix(m.group()), text)

# 测试示例
test_str = 'I was born in September 22 and I am 1 in swimming'
print(cardinal_to_ordinal(test_str))

运行输出和上述方案一致。

内容的提问来源于stack exchange,提问作者Mohammad Javad Choopani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:27:02