You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用正则表达式匹配数字序列:西数转中文数字函数遇REGEX问题

阿拉伯数字转中文数字:正则+函数实现方案

嘿,我懂你卡在正则这块的纠结!咱们就围绕你说的三条规则,一步步把这个转换函数搞出来,正则部分也给你讲明白~

先明确规则对应场景

咱们先把规则拆解成正则能匹配的场景:

  • 0-9 + 10:直接对应固定汉字(比如10
  • 11-19:十位固定是1,结果是十+个位汉字(比如16十六
  • 20-99:十位是2-9,结果是十位汉字+十+个位汉字,但个位为0时要省略(比如20二十,不是二十零

正则匹配逻辑+Python实现

首先咱们先做个数字到中文的映射字典,然后用正则匹配不同的数字格式,分组后替换成对应中文:

import re

# 基础数字映射表
num_to_chinese = {
    '0': '零', '1': '一', '2': '二', '3': '三', '4': '四',
    '5': '五', '6': '六', '7': '七', '8': '八', '9': '九',
    '10': '十'
}

def arabic_to_chinese(num_str):
    # 先处理特殊的10
    if num_str == '10':
        return num_to_chinese['10']
    
    # 匹配0-9的单个数字
    single_digit = re.fullmatch(r'^[0-9]$', num_str)
    if single_digit:
        return num_to_chinese[num_str]
    
    # 匹配11-19的数字:开头是1,后面跟1-9
    teen_num = re.fullmatch(r'^1([1-9])$', num_str)
    if teen_num:
        unit_char = num_to_chinese[teen_num.group(1)]
        return f"十{unit_char}"
    
    # 匹配20-99的数字:开头2-9,后面跟0或1-9
    double_num = re.fullmatch(r'^([2-9])(0|[1-9])$', num_str)
    if double_num:
        ten_char = num_to_chinese[double_num.group(1)]
        unit_char = double_num.group(2)
        # 个位是0的话,只返回“X十”
        if unit_char == '0':
            return f"{ten_char}十"
        # 个位非0,返回“X十X”
        return f"{ten_char}十{num_to_chinese[unit_char]}"
    
    # 超出0-99范围的情况可以自定义提示
    return "目前仅支持0-99的数字转换哦"

正则规则解释

这里的正则都用了fullmatch,确保整个字符串完全匹配,避免部分匹配的问题:

  • ^[0-9]$:匹配单个0-9的字符,确保是一位数
  • ^1([1-9])$^1限定开头是1,([1-9])捕获个位的1-9数字,用于后面拼接“十X”
  • ^([2-9])(0|[1-9])$:第一个分组([2-9])捕获十位数字,第二个分组(0|[1-9])捕获个位的0或1-9数字,方便处理个位为0的特殊情况

测试下效果

你可以试试这些调用:

print(arabic_to_chinese('5'))    # 输出:五
print(arabic_to_chinese('16'))   # 输出:十六
print(arabic_to_chinese('37'))   # 输出:三十七
print(arabic_to_chinese('20'))   # 输出:二十
print(arabic_to_chinese('10'))   # 输出:十

要是之后需要扩展到百位、千位甚至更高位数,只需要在正则里增加对应分组(比如百位的([1-9])),再加上“百”“千”这类单位逻辑就行啦~

内容的提问来源于stack exchange,提问作者David Salas Boscan

火山引擎 最新活动