从 Python 中的字符串中提取特定货币金额

Ber*_*and 1 python regex

我想用具有这种形式的货币(列表)提取价格:

  • 1.10 美元
  • 1,10 欧元
  • 1,10 欧元

  • 1 美元

  • 18 欧元
  • 1€
  • 5$

  • 1.10 美元

  • 1,10 欧元
  • 1,10€
  • 1.99 美元
  • 1,99 美元

  • 1.10 欧元

  • 1.99 欧元
  • 10 欧元

  • 1.10 欧元

  • 1,99 欧元
  • 10 欧元

  • 1.10 美元

  • 1,99 美元
  • 10 美元

我用正则表达式尝试了这个 python 函数 re.findall(pattern, string)

(?:[\£\$\€]{1}[,\d]+.?\d*)

https://regex101.com/r/X5SPDK/1

但我没有得到预期的结果

Emm*_*mma 6

如果您不进行验证,则此表达式可能更接近您的想法:

[£$€]\s*[.,\d]+|[.,\d]+\s*[£$€]|(?:Eur|dollars?)\s*[.,\d]+|[.,\d]+\s*(?:Eur|dollars?)
Run Code Online (Sandbox Code Playgroud)

并且验证失败。如果您可能想要捕获数字,您还可以添加捕获组。

测试

import re

regex = r"[£$€]\s*[.,\d]+|[.,\d]+\s*[£$€]|(?:Eur|dollars?)\s*[.,\d]+|[.,\d]+\s*(?:Eur|dollars?)"

test_str ="""
I bought a car $12,250,000 it was expensive 
that thing was £14,500,123.125521 dollas 
afsaf£120.25sfsafsa 
$ 1.10
€ 1,10
1,10 €

$ 1

€ 18
1€
5$

$1.10

€1,10
1,10€
1.99$
1,99$

Eur 1.10

Eur 1,99
Eur 10

Eur1.10

Eur1,99
Eur10

1.10 dollar

1,99 dollar
10 dollar


"""

print(re.findall(regex, test_str, re.I))
Run Code Online (Sandbox Code Playgroud)

输出

['$12,250,000', '£14,500,123.125521', '£120.25', '$ 1.10', '€ 1,10', '1,10 €', '$ 1', '€ 18', '1€', '5$', '$1.10', '€1,10', '1,10€', '1.99$', '1,99$', 'Eur 1.10', 'Eur 1,99', 'Eur 10', 'Eur1.10', 'Eur1,99', 'Eur10', '1.10 dollar', '1,99 dollar', '10 dollar']
Run Code Online (Sandbox Code Playgroud)

如果你想探索/简化/修改表达式,它已在regex101.com 的右上角面板中进行了 解释。如果您愿意,您还可以在此链接中观看它如何与某些示例输入匹配。


正则表达式电路

jex.im可视化正则表达式:

在此处输入图片说明

  • 您可以添加标志 [re.IGNORECASE](https://docs.python.org/3/library/re.html#re.IGNORECASE) 进行不区分大小写的匹配。 (3认同)