Python正则表达式(从字符串中提取货币值)

时间:2012-01-12 13:04:12

标签: python regex

我正在修改包含以下形式字符串的数据:

" The little £250,000 brown fox jumped over the lazy dog" 

[澄清]

要转换为double的字符串可能已经“清理”过了,可能只是这样:

"£250,000"

我设法将一个粗略的功能组合在一起,将像“25万英镑”这样的字符串打成一个双重字符串。但是,当我看到一个像上面那样的字符串时,我正在努力写一个正则表达式来理解字符串的货币部分。问题是我不知道我将遇到哪种类型的字符串 - 即“清理”货币值(如第二个示例)或“脏”字符串(如第一个示例)。我需要编写一个函数来处理两种类型的字符串,并将货币字符串作为double返回。

对于'脏'字符串,有人可以推荐如何模式匹配货币值(预期最低值:£1,预期最高£99,999,999)。另外,如果有更多pythonic方式编写下面的函数,我想听听Pythonistas的建议。

    non_numeric = re.compile(r'[^0-9\.]+')

    def string_to_decimal(s):
        try:
            s= s.decode('ascii')
        except:
            s = s[1:] # Assumption is that s begings with currency symbol

        s = str(s)  # Probably superfulous?

        s = s.replace(',','')
        s = non_numeric.sub('', str(s))
        return decimal.Decimal(s)

3 个答案:

答案 0 :(得分:2)

r'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?'

将匹配货币表达式,例如

>>> re.findall(r'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?',
... " The little £250,000 brown fox jumped over the lazy dog")
['\xc2\xa3250,000']

您可以使用

将结果值转换为Decimal
>>> Decimal('\xc2\xa3250,000'.decode('utf-8')[1:].strip(','))
Decimal('250000')

(假设是UTF-8。)

答案 1 :(得分:1)

尝试:

re.findall('£{1}[,0-9]{1,10}','The little £250,000 brown fox jumped over the lazy dog')

然后取出比赛结果并删除逗号。

答案 2 :(得分:0)

如果输入文本可以使用各种语言,则需要担心不同语言环境中标点符号的差异。

你所谓的“£250,000”在某些语言环境中会是“£250.000”,反之亦然:“£0.50”可以写成“£0,50”。可能有更多的品种。

忽略这一点,我想你的例子应该用正则表达式来处理,例如r"£[0-9,.]+"