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
相关产品推荐
相关产品推荐

