我正在尝试从文本中提取这些内容:
- 货币格式的金额 + 前缀/后缀
- 任何其他数值
货币格式可以用各种组合和不同的货币表示,即美元、美元、美元、欧元等。
例:
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
如果有人可以帮助我,请不胜感激。谢谢!
您可以使用以下正则表达式来实现您的目的:
^(?:(?:[a-z]{0,} ?$? *)d+(?:.d+)?)$|^(?:d+(?:.d+)?[a-z]{1,})$
上述正则表达式的解释:
^, $
- 分别表示字符串的开始和结束。
?:
- 表示非捕获组
(?:[a-z]* ?$? *)
- 表示开头包含$ 和 USD(根据您的示例(的情况。它可以在它们之间或数值开始之前包含零个或多个空格。您还需要在此处编辑正则表达式,以便添加其他货币符号,如 ₹、€ 等。
d+
- 匹配数字 1 次或更多次。
(?:.d+)?
- 与小数部分 0 或 1 时间匹配的非捕获组。|- 表示交替
(?:d+(?:.d+)?[a-z]{1,})
- 一个非捕获组,用于匹配货币跟随数字的情况。(123美元,如你的情况(。
您可以在此处找到上述正则表达式的演示。
在 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))
可以在此处找到示例运行。不过,您可以根据需要操作代码。
这直接给出为列表:
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)