我正在尝试在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美元。
我将美元部分和分数部分分成不同的组,以便稍后进行进一步处理。这就是为什么我的输出是一个元组列表。
这里有一个问题是我不知道输入文件中将使用什么分隔符(如果有的话)。
我是正则表达式的新手,非常感谢一些帮助。谢谢!
答案 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.])
答案 2 :(得分:0)
试试这个
\$(?!0\d)\d+(?:\.\d{2})?(?=\s|$)
匹配
$34.23 $23 $23.23 $2 $2313443.23 $3422342 $0.99 $3.00