【问题标题】:Extract amount + prefix / suffix for monetary value in python在python中提取货币价值的金额+前缀/后缀
【发布时间】:2020-05-21 00:39:16
【问题描述】:

我正在尝试从文本中提取这些内容:

  1. 金额+货币格式的前缀/后缀
  2. 任何其他数值

货币格式可以用各种组合来表示,并且可以用于不同的货币,即usd、usd$、us$、eur等。下面的示例仅针对美元货币。

示例:

text = 'usd$4540.34, some text, usd $1234.34, $123.98, $234, $ 123, USD$1621.09, usd109, 123usd, 8888, some other text, foo, bar'

到目前为止,我有这个代码:

re.sub(r"[^(\w{1,})?\$?\d.*\.?\d*$]|[^0-9$+.,\s']", '', text, flags=re.I).strip(',')

但它正在返回这个结果

'$4540.34,,$1234.34,$123.98,$234,$123,$1621.09,109,123,8888'

根据上面的例子,正则表达式应该返回这个预期的输出

usd$4540.34, usd $1234.34, $123.98, $234, $ 123, USD$1621.09, usd109, 123usd, 8888

感谢是否有人可以帮助我。谢谢!

【问题讨论】:

  • 嗨@Mandy8055,是的。设法调整正则表达式以包含 8888。感谢您的帮助!
  • 是的,会很好

标签: python regex


【解决方案1】:

您可以使用以下正则表达式:

^(?:(?:[a-z]{0,} ?\$? *)\d+(?:\.\d+)?)$|^(?:\d+(?:\.\d+)?[a-z]{1,})$

上面Regex的解释:

^, $ - 分别代表字符串的开始和结束。

?: - 代表非捕获组

(?:[a-z]* ?\$? *) - 表示开头包含 $ 和 usd(根据您的示例)的案例。它可以在它们之间或数值开始之前包含零个或多个空格。您还需要在此处编辑正则表达式,以便添加其他货币符号,如 ₹、€ 等。

\d+ - 匹配一个数字 1 次或多次。

(?:\.\d+)? - 匹配小数部分 0 或 1 次的非捕获组。

| - 表示交替

(?:\d+(?:\.\d+)?[a-z]{1,}) - 一个非捕获组,用于匹配货币跟随数字的情况。(123usd 与您的情况一样)。 p>

可以找到上述正则表达式here.的demo

在python中的实现:

import re
regex =  r"^(?:(?:[a-z]{0,} ?\$? *)\d+(?:\.\d+)?)$|^(?:\d+(?:\.\d+)?[a-z]{1,})$"
text = 'usd$4540.34, some text, usd $1234.34, $123.98, $234.32.2, $ 123, USD$1621.09, usd109, 123usd, 8888, some other text, foo, bar, 998.90'
text = text.replace(', ', '\n')
print(re.findall(regex, text, flags=re.I | re.M))

您可以找到示例运行here. 尽管您可以根据您的要求操作代码。

【讨论】:

    【解决方案2】:

    这直接作为列表给出:

    pattern = r'((?:[a-z]+ ?)?(?:[$] *)?\d+(?:\.\d+)?[a-z]*)'
    text = 'usd$4540.34, some text, usd $1234.34, $123.98, $234, $ 123, USD$1621.09, usd109, 123usd, 8888, some other text, foo, bar'
    re.findall(pattern, text, flags=re.I)
    

    【讨论】:

    • 嗨@Philippe。您的正则表达式也可能接受一些不利的字符串。请参阅this。我建议您使用单词边界或多行标志以及开始和结束分隔符,以使您的正则表达式更加高效和具体。
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多