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

4

我正在处理包含以下格式字符串的数据:

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

[澄清]

要转换为双精度浮点数的字符串可能已经被“清理”过,只是看起来像这样:

"£250,000"

我设法拼凑出一个简单的函数,将像“£250,000”这样的字符串转换为 double 类型。然而,当遇到像上面那个字符串一样的字符串时,我不知道该如何编写正则表达式来解析字符串的货币部分。问题在于我不知道会遇到哪种类型的字符串——即“清洗过”的货币值(如第二个示例)或“脏”字符串(如第一个示例)。我需要编写一个单一的函数来处理这两种类型的字符串,并将货币字符串返回为 double 类型。
对于“脏”字符串,有人能推荐一下如何匹配货币值(期望最小值:£1,期望最大值:£99,999,999)。此外,如果有更 Pythonic 的方法来编写下面的函数,我想听听 Python 程序员们的建议。
    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)

try 之前使用 s = str(s) 是有意义的。由于解码仅适用于字符串,并且索引不适用于整数,因此您可以假定在 try/except 之后它是一个字符串。否则,您的程序将在 except 中抛出异常(这将不会被捕获)。 - Brigand
4个回答

3

尝试:

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

然后取出匹配结果并去除逗号。

+1:我在我的完整解决方案中也使用了您的正则表达式,以匹配“脏”字符串。 - Homunculus Reticulli

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编码。)

我在使用上面的片段时遇到了以下错误:SyntaxError: Non-ASCII character '\xc2' in file /path/to/myscript.py on line 140, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details. 我将检查该URL以获取更多详细信息。 - Homunculus Reticulli
@HomunculusReticulli:在文件顶部加上 # -*- coding: utf-8 -*-,以告诉 Python 解释器该源文件的编码方式。 - Fred Foo
谢谢,那个错误已经修复了。不过,我需要澄清一下,我需要能够匹配像“£250,000”这样的字符串(其中没有其他文本围绕货币值)。 - Homunculus Reticulli
我本以为它会匹配 - 但是没有。可能是我自己的问题,我会检查并重试一遍。 - Homunculus Reticulli
@HomunculusReticulli:可能是一些编码问题。尝试使用re.match(ur'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?', u"£250,000")(注意Unicode字符串)。 - Fred Foo
显示剩余2条评论

0

如果输入文本可以是各种语言,您需要担心不同区域的标点符号差异。

在某些区域中,您所称呼的“£250,000”将会是“£250.000”,而对于分数来说则相反:“£0.50”可以写成“£0,50”。可能还有更多的变化。

忽略这些差异,您的示例应该由正则表达式处理,例如r"£[0-9,.]+"


0
如果您同意安装一个名为price-parser的额外Python包,那么您可以尝试以下步骤:
安装该包。
python -m pip install price-parser

获取货币和金额的代码
from price_parser import Price
result = Price.fromstring(" The little £250,000 brown fox jumped over the lazy dog")
print(result)

输出:

Price(amount=Decimal('250000'), currency='£')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接