Python Regular Expression以匹配特定的货币格式

时间:2016-04-20 01:06:57

标签: python regex file currency

我正在尝试在python 3.4中编写一个正则表达式,它将从潜在价格的文本文件中获取输入并匹配有效的格式。

要求是价格为$ X.YY或$ X格式,其中X必须大于0。

无效格式包括$ 0.YY,$ .YY,$ X.Y,$ X.YYY

到目前为止,这就是我所拥有的:

import re
from sys import argv

FILE = 1

file = open(argv[FILE], 'r')
string = file.read()
file.close()

price = re.compile(r"""         # beginning of string
                       (\$      # dollar sign
                       [1-9]    # first digit must be non-zero
                       \d * )   # followed by 0 or more digits
                       (\.       # optional cent portion
                       \d {2}  # only 2 digits allowed for cents
                         )?     # end of string""", re.X)

valid_prices = price.findall(string)
print(valid_prices)

这是我现在用来测试的文件:

的test.txt

 $34.23 $23 $23.23 $2 $2313443.23 $3422342 $02394 $230.232 $232.2 $05.03

当前输出:

$[('$34', '.23'), ('$23', ''), ('$23', '.23'), ('$2', ''), ('$2313443', '.23'), ('$3422342', ''), ('$230', '.23'), ('$232', '')]

当这些应被拒绝时,它目前匹配230.232美元和232.2美元。

我将美元部分和分数部分分成不同的组,以便稍后进行进一步处理。这就是为什么我的输出是一个元组列表。

这里有一个问题是我不知道输入文件中将使用什么分隔符(如果有的话)。

我是正则表达式的新手,非常感谢一些帮助。谢谢!

3 个答案:

答案 0 :(得分:1)

添加零宽度正向前瞻(?=\s|$)以确保匹配后面只有空格或行尾:

>>> s = '$34.23 $23 $23.23 $2 $2313443.23 $3422342 $02394 $230.232 $232.2 $05.03'

>>> re.findall(r'\$[1-9]\d*(?:\.\d{2})?(?=\s|$)', s)
['$34.23', '$23', '$23.23', '$2', '$2313443.23', '$3422342']

答案 1 :(得分:0)

如果它真的不清楚,将使用哪个分隔符,对我来说只检查"不是数字而不是数字"作为界限:

\$[1-9]\d*(\.\d\d)?(?![\d.])

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

答案 2 :(得分:0)

试试这个

\$(?!0\d)\d+(?:\.\d{2})?(?=\s|$)

Regex demo

匹配

$34.23 $23 $23.23 $2 $2313443.23 $3422342 $0.99 $3.00