正则表达式,获得价格。但小数点的点或逗号

时间:2014-12-05 09:25:23

标签: python regex

我想使用正则表达式从文本中获取价格。

小例子: “这个伟大的产品今天仅售1.000,59欧元!”

我想从上面的文字中得到价格。到目前为止,这是我的python正则表达式:

re.findall(ur'([0-9,.]*)', text)

只有一个小问题。有些文本使用逗号(,)来分割小数,其他文本使用点(。),其中一些甚至没有小数或用短划线( - )替换00小数,如€59, -

所以理想的情况是,(在我看来)获得所有价格没有任何问题:

  • 如果从右到左检查数字,第3个字符是点还是逗号(因为每个价格不包含超过2个小数)?
  • 它是否包含短划线(如€50, - )?

如果两者都为NO:删除所有点和逗号。 如果两个问题中的一个是YES:如果小数点用点(。)分隔,用逗号替换该点,或者如果它已经是逗号,就这样保留它。并删除其余的逗号和点。

正则表达式可以吗?

1 个答案:

答案 0 :(得分:2)

编辑:

抱歉,我没有仔细阅读问题描述。我认为要解决这个问题,你需要两个正则表达式模式。首先执行re.sub()然后re.findall()

pattern = re.compile(r'(([.,]{1})(\d{1,3}|-))')  
s = "2,456,777.00  xxxxxxxxxxxxx 59,789,- xxxxxxxxxxxx 59,-  xxxxxxxxxx 1.000,59"

def subs(m):
    g0 = m.group(0)
    g3 = m.group(3)

    if g3 == '-':
        g3 = '00'
    if len(g0) == 4:
        return ',' + g0[1:4]
    else:
        return '.' + g3

c = re.findall(r'[\d.,-]+', re.sub(pattern, subs, s))
print c

>> ['2,456,777.00', '59,789.00', '59.00', '1,000.59']
确实有点麻烦。希望有人能想出一个更聪明的人。