求可提取正负价格的Python正则表达式,忽略货币符号与分隔符
适用于Python的标准化价格提取方案
核心思路
要实现需求,先通过正则捕获价格的关键组成部分(正负号、整数段、小数段),再对捕获内容做格式化处理:移除千位分隔符,统一小数分隔符为点号,最终拼接成单一标准化结果。
实现代码
import re def extract_normalized_price(text): # 正则匹配价格核心部分,捕获正负号、整数段、小数分隔符及小数位 pattern = re.compile(r'[^\d-]*(-?)([\d.,]+)(?:([.,])(\d+))?[^\d]*') match = pattern.search(text) if not match: return None sign = match.group(1) # 移除整数段的千位分隔符(逗号/点) clean_integer = match.group(2).replace(',', '').replace('.', '') decimal_part = match.group(4) or '' # 拼接标准化结果 if decimal_part: return f"{sign}{clean_integer}.{decimal_part}" return f"{sign}{clean_integer}" # 测试用例验证 test_inputs = [ "1,234.56", "£ 1,234.56", "£ 1234,56", "€1.234,56", "-1,234.56", "£ -1,234.56", "£ -1234,56", "€-1.234,56" ] for input_str in test_inputs: normalized = extract_normalized_price(input_str) print(f"输入: {input_str} → 输出: {normalized}")
正则与逻辑说明
正则分解:
[^\d-]*:匹配开头的非数字/非负号内容(如货币符号、空格),无需捕获(-?):捕获可选的负号(正号默认省略,因输入无显式正号场景)([\d.,]+):匹配带千位分隔符的整数段(?:([.,])(\d+))?:非捕获组,匹配可选的小数部分,捕获分隔符与小数数字[^\d]*:匹配结尾的非数字内容,无需捕获
格式化处理:
- 整数段:直接移除所有逗号和点(千位分隔符)
- 小数部分:若存在则保留数字,统一用点号连接到整数段后
- 正负号:直接保留原符号
测试结果
运行上述代码后,所有测试用例均会输出符合要求的单一标准化价格:
- 正价输入统一输出
1234.56 - 负价输入统一输出
-1234.56
内容的提问来源于stack exchange,提问作者user973025
相关产品推荐
相关产品推荐

