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
关键修改说明
- 正则匹配顺序:通过
sorted(unit_map.keys(), key=lambda x: -len(x))让长单位先被匹配,彻底解决“千萬”被拆分的问题。 - 单位映射:用字典替代列表索引查找,直接通过单位字符串获取对应数值,逻辑更清晰且避免索引越界或匹配错误。
- 多段数字处理:自动在阿拉伯数字前添加加号,确保“X单位Y单位”这类输入能被正确解析为加法表达式,计算总和。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

