【问题标题】:Extract the number and following letter from regex从正则表达式中提取数字和以下字母
【发布时间】:2012-12-30 03:40:20
【问题描述】:

我有很多涉及货币值的字符串,例如 $15KUSD20M€1.8k 等 现在我需要提取数字和乘数(K、k、M 或 m)来处理数据。

我想出了以下正则表达式:

[\${1}|€{1}][0-9]+(?:\.[0-9]*)?[M|K|k|m]

但我不确定如何提取表达式的每个子部分并将它们作为变量返回给我的 Python 代码,所以对于$15K,我想要:

currency='$'
ammount=15
multiplier='K'

有什么想法吗?

【问题讨论】:

  • 你能提供一些示例输入吗?
  • @AshwiniChaudhary 他做到了。

标签: python regex


【解决方案1】:

像这样?

In [1]: import re 

In [2]: re.match(r'(?P<currency>\D+)(?P<amount>\d+(\.\d+)?)(?P<multiplier>[mMkK])', '$15k').groupdict()
Out[2]: {'amount': '15', 'currency': '$', 'multiplier': 'k'}

不过,在 Python 中并不是真的有必要这样做

currency, amount, _, multiplier =  re.match(r'(\D+)(\d+(\.\d+)?)([mMkK])', '$1.5k').groups()

甚至更简单

currency, amount, multiplier = re.match(r'(\D+)(\d+(?:\.\d+)?)([mMkK])', '$1.5k').groups()

【讨论】:

  • 不处理 €1.8k 的情况。
  • @Mark 谢谢,添加了一个修复,虽然也不完美,但可能已经足够了。
【解决方案2】:

类似这样的:

In [68]: lis= ["$15K", "USD20","$1.5K"]

In [69]: l=lambda x:re.findall(r"(\$|USD)(\d*\.\d+|\d+)([MKkm])?",x)
                                    |          |           |     
                                    ^          ^           ^
                                   currency   amt          multiplier
In [70]: map(l,lis)
Out[70]: [[('$', '15', 'K')], [('USD', '20', '')], [('$', '1.5', 'K')]]

【讨论】:

  • [] 中的| 不正确。两者都可以单独工作:[MKkm]M|K|k|m
  • 现在只需添加,这将是完美的。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2019-08-08
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多