Python Regex,获取价格。但小数是点或逗号

Python Regex,获取价格。但小数是点或逗号,python,regex,Python,Regex,我想使用正则表达式从文本中获取价格 小例子: “这项伟大的产品今天只需1.000,59欧元!” 我想从上面写的文本中得到价格。这是迄今为止我的python正则表达式: re.findall(ur'([0-9,.]*)', text) 只有一个小问题。一些文本使用逗号(,)分隔小数,其他文本使用点(.),其中一些文本甚至没有小数或用破折号(-)替换00小数,如59欧元- 因此,理想的情况是(在我看来)获得所有价格而没有任何问题: 如果从右到左检查数字,第三个字符是点还是逗号(因为每个价格包含的

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

小例子: “这项伟大的产品今天只需1.000,59欧元!”

我想从上面写的文本中得到价格。这是迄今为止我的python正则表达式:

re.findall(ur'([0-9,.]*)', text)
只有一个小问题。一些文本使用逗号(,)分隔小数,其他文本使用点(.),其中一些文本甚至没有小数或用破折号(-)替换00小数,如59欧元-

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

  • 如果从右到左检查数字,第三个字符是点还是逗号(因为每个价格包含的小数不超过2)
  • 它是否包含破折号(比如50欧元)
如果两者均为否:删除所有点和逗号。 如果两个问题中有一个是肯定的:如果小数被一个点(.)分隔,用逗号替换该点,或者如果它已经是一个逗号,就这样保留它。并删除其余的逗号和点

使用regex是否可以这样做?

编辑:

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


确实有点麻烦。希望有人能想出一个更聪明的人。

一个前男友是不够的。随预期输出一起提供更多信息。查找货币符号如何?另外,你有没有在谷歌上搜索过“regex”和“currency”?@AvinashRaj,你能帮我找到一个可行的解决方案吗?用一个额外的分割函数还是什么?用哪种语言真的没关系。我可以翻译:P@tobias_k问题并不是将价格从文本中分离出来。主要问题是点和逗号。我们在数据库中将其保存为十进制。如果它不包含任何小数,postgres将添加它们。但如果它确实包含小数,我们希望提取它们。但是你可以在我的第一篇文章中看到这个问题。@Erikvande甚至尝试一下这个
\(?=\d{2}\b)
,然后用
替换匹配的
,我不得不说,到目前为止效果非常好。我想我必须添加替换小数点分隔符、破折号等的功能。通过使用其他一些函数?:)替换小数点分隔符?你能说清楚一点吗?这是目前的主要问题。我们必须向postgres(2456777或2456777.00)提供正确的十进制格式<代码>([0-9,.]*)在第一种情况下很好地获得了全部价格,但是因为我们用点替换了逗号(1.000,59变为1.000.59),postgres实际上节省了1.00。在我的第一篇文章中看到我的“理想”情况。在荷兰,我们有价格为1.000,59,1000.59,1.000,-,1000和1.000的网站。这就是我在第一篇文章中试图解释的。检查字符串是否包含小数的最佳方法是检查或右起第三个字符是点或逗号。剩下的部分在我的第一篇文章中已经解释过了。你应该添加一个解释来解释你的正则表达式到底做了什么。
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']