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

Python中混合中文与阿拉伯数字转数值的代码问题求助

解决方案

问题1:正则匹配优先级修正

原代码的正则表达式会优先匹配短单位,导致“千萬”这类长单位被拆分为“千”和“萬”分别匹配,破坏了单位的完整性。解决核心是让长单位优先被匹配:将单位按字符串长度从长到短排序,再生成正则表达式。

问题2:单位映射逻辑优化

原代码通过units.index()查找索引的方式效率低且容易出错,同时空字符串不需要参与匹配。改用键值对字典直接映射单位到对应数值,既避免索引查找的潜在问题,也提升了转换效率。


修正后的完整代码

import re

# 构建单位到数值的映射字典,按单位长度降序排列确保长单位优先匹配
unit_map = {
    '千億': 10**11,
    '百億': 10**10,
    '十億': 10**9,
    '億': 10**8,
    '千萬': 10**7,
    '百萬': 10**6,
    '十萬': 10**5,
    '萬': 10**4,
    '千': 10**3,
    '百': 10**2,
    '十': 10**1
}

# 生成正则模式:按单位长度从长到短匹配
pattern = re.compile('|'.join(sorted(unit_map.keys(), key=lambda x: -len(x))))

def replace_unit(match):
    # 直接从字典获取对应数值,拼接成乘法表达式片段
    return f'*{unit_map[match.group(0)]}'

def convert_mixed_num(input_str):
    # 处理多段数字的情况:在每个阿拉伯数字前添加加号,再去掉开头多余的加号
    processed_str = re.sub(r'(\d)', r'+\1', input_str).lstrip('+')
    # 替换所有中文单位为对应的乘法表达式
    calc_expr = pattern.sub(replace_unit, processed_str)
    # 计算最终数值
    return eval(calc_expr)

# 测试用例
print(convert_mixed_num('5萬'))          # 输出:50000
print(convert_mixed_num('5千萬5千'))     # 输出:50005000
print(convert_mixed_num('3百萬2十'))     # 输出:3000020

关键修改说明

  1. 正则匹配顺序:通过sorted(unit_map.keys(), key=lambda x: -len(x))让长单位先被匹配,彻底解决“千萬”被拆分的问题。
  2. 单位映射:用字典替代列表索引查找,直接通过单位字符串获取对应数值,逻辑更清晰且避免索引越界或匹配错误。
  3. 多段数字处理:自动在阿拉伯数字前添加加号,确保“X单位Y单位”这类输入能被正确解析为加法表达式,计算总和。

内容的提问来源于stack exchange,提问作者Raptor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:43:04