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

4

我正在编写一个小工具,从字符串(通常是推文)中提取一堆值。

该字符串可能由单词和数字组成,以货币符号(£、$、€等)为前缀的金额以及一些哈希标签(#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"。

tagex可以找到hashtag,但是我无法使用curex提取金额,目前的结果如下:Amount: £6.50 #projectfoo #clientmeeting。

我还需要将货币符号分离出来,以便将金额作为浮点数获取,但稍后应该很容易实现。

3个回答

17
>>> re.search(ur'([£$€])(\d+(?:\.\d{2})?)', s).groups()
(u'\xa3', u'6.50')
  • [£$€] 匹配一个货币符号
  • \d+(?:\.\d{2}) 匹配一个或多个数字,后面可选跟小数点,然后再跟两位数字
  • () 括号分别捕获符号和金额

你的正则表达式问题在于 .* 匹配所有字符,并且是贪婪匹配,因此在正则表达式末尾它会匹配其后的所有内容。


太棒了,谢谢 :-) 我还发现我需要在文件顶部添加 # -- coding: utf-8 --,但我想这只是个好习惯吧? - Sam Machin
@Sam 2.x需要它,但3.x默认为utf-8。只有在必要的情况下(如本例)才会添加标题。 - moinudin
由于某些原因,除非我在字符串之前删除u前缀,否则会出现语法错误。 - user377628

2

我稍微修改了Marcog的正则表达式,通过转义美元符号:

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

以匹配货币符号和金额。


0
如果您同意安装一个名为price-parser的额外Python包,那么您可以尝试以下步骤:
安装该包。
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='£')

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