如何在字符串中找到货币值?

4 投票
3 回答
10962 浏览
提问于 2025-04-16 11:00

我正在写一个小工具,用来从一串文字中提取一些值(通常是一条推文)。

这串文字可能包含单词和数字,还有一个以货币符号(比如£、$、€等)开头的金额,以及一些标签(比如#foo #bar)。我在appEngine上运行,并使用tweepy来获取推文。

我现在用来找到这些值的代码如下:

tagex = re.compile(r'#.*')
curex = re.compile(ur'[£].*')
for x in api.user_timeline(since_id = t.lastimport):
          tags = re.findall(tagex, x.text)
          amount = re.findall(curex, x.text)[0]
          logging.info("Text: " + x.text)
          logging.info("Tags: " + str(tags))
          logging.info("Amount: " + amount)

其中x.text的例子是“Taxi London £6.50 #projectfoo #clientmeeting”。

我的代码可以很好地找到标签,但我现在无法让curex提取出金额,目前得到的是:金额:£6.50 #projectfoo #clientmeeting。

我还需要把货币符号分开,这样才能把金额转换成浮点数,不过这部分应该稍后就能简单处理。

3 个回答

0

如果你愿意安装一个额外的Python包,叫做 price-parser,那么你可以试试下面的步骤:

首先,安装这个包

python -m pip install price-parser

接下来,使用下面的代码来获取货币和金额

from price_parser import Price
result = Price.fromstring("Taxi London £6.50 #projectfoo #clientmeeting")
print(result)

输出结果是:

Price(amount=Decimal('6.50'), currency='£')
2

我对Marcog的正则表达式做了一些修改。


    re.search(ur'([£\$€])(\d+(?:\.\d{2})?)', s).groups()

主要是对美元符号进行了转义处理。

17
  • [£$€] 匹配一个货币符号
  • \d+(?:\.\d{2}) 匹配一个或多个数字,后面可以跟一个小数点,后面必须有正好两位数字
  • () 用来分别捕捉符号和金额
>>> re.search(ur'([£$€])(\d+(?:\.\d{2})?)', s).groups()
(u'\xa3', u'6.50')

你这个正则表达式的问题在于 .* 可以匹配任何东西,而且它是贪婪的,所以在正则表达式的末尾,它会匹配后面所有的内容。

撰写回答