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

求可提取正负价格的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}")

正则与逻辑说明

  1. 正则分解:

    • [^\d-]*:匹配开头的非数字/非负号内容(如货币符号、空格),无需捕获
    • (-?):捕获可选的负号(正号默认省略,因输入无显式正号场景)
    • ([\d.,]+):匹配带千位分隔符的整数段
    • (?:([.,])(\d+))?:非捕获组,匹配可选的小数部分,捕获分隔符与小数数字
    • [^\d]*:匹配结尾的非数字内容,无需捕获
  2. 格式化处理:

    • 整数段:直接移除所有逗号和点(千位分隔符)
    • 小数部分:若存在则保留数字,统一用点号连接到整数段后
    • 正负号:直接保留原符号

测试结果

运行上述代码后,所有测试用例均会输出符合要求的单一标准化价格:

  • 正价输入统一输出 1234.56
  • 负价输入统一输出 -1234.56

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:45:11