使用正则表达式匹配数字序列:西数转中文数字函数遇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




