Python 正则表达式匹配带或不带逗号或小数的货币

标签 python regex

如何编写可以 1. 匹配可能包含或不包含逗号或小数的货币以及 2. 仅匹配货币代码的正则表达式。我看到的主要是匹配的货币符号。 我希望能够从如下完整文本中匹配货币 ['300,000.00'] 和货币代码 ['USD']:

用户 ID 9XXXX219 在 2016 年 7 月 1 日 08:34:32 销售额 USD300,000.00

到目前为止,我试过了,但它只匹配带小数点的,不匹配没有小数点或带逗号的:

s = 'USD1 USD1.00 USD100.00 USD1,000 CAD1,000.00'
re.findall(r'\d+\.\d+', s)
#matches
['1.00', '100.00', '000.00']

#should not match any other thing e.g. 1XXXX324

#instead of this:
['1','1.00', '100.00', '1,000', '1,000.00']

以及如何编写另一个正则表达式模式来仅匹配货币代码?即

['USD', 'USD', 'USD', 'USD','CAD'] 

最佳答案

获取货币:

拥有一份详尽的有效货币列表可能不可行,但如果货币数量有限,那么您可以这样做:

re.findall('USD|CAD','USD1 USD1.00 USD100.00 USD1,000 CAD1,000.00 123XXX123')

输出:

['USD', 'USD', 'USD', 'USD', 'CAD']

获取金额:

使用捕获组,re.findall返回元组中的每个捕获。使用非捕获组 (?:)将解决问题。

re.findall('(?<=USD|CAD)\d{1,3}(?:,\d{3})*(?:\.\d+)?(?=\s)','Userid 9XXXX219 sales USD300,000.00 On 01-JUL-2016 08:34:32')

输出:

['300,000.00']

带有示例文本的插图:

re.findall('(?<=USD|CAD)\d{1,3}(?:,\d{3})*(?:\.\d+)?(?=\s)','USD1 USD1.00 USD100.00 USD1,000 CAD1,000.00 123XXX123')

输出:

['1', '1.00', '100.00', '1,000', '1,000.00']

阅读更多以下内容 here :

(?=) - 积极的前瞻 (?<=) - 积极的回顾

关于Python 正则表达式匹配带或不带逗号或小数的货币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38143814/

相关文章:

python - 使用 BlobServiceClient 和 Python V12 SDK 将本地文件夹上传到 Azure Blob 存储

r - 基于同一数据框中列名部分匹配的子集列

javascript - 最小值 18 和最大值 99 带前导零的正则表达式

php - 正则表达式匹配字符串中的所有 *texttexttext

python - np.where() 相当于 df.loc()

python - Flask - 将反馈数据存储到服务器

python Pandas TypeError : Cannot compare type 'Timestamp' with type 'float'

python - 是否可以从 RetryError 中恢复 HTTP 响应? (Python请求库)

.net - .NET 的正则表达式图灵完整吗?

c# - 正则表达式忽略大括号