我正在寻找一个在评论行中查找价格的正则表达式,可以格式不同(取决于输入的人
REG / SZ / 236,30 SUMMER
应该匹配236.30(相当简单)
WB / SZ / 187.75 EBS
应该匹配187.75(到目前为止我可以做到这一点)
这里是棘手的
FS / EBS / 1*145.80 + 231.30
FS / EBS / 1x 145,80 + 231
FS / EBS / 3x 145.80 + 4x231
FS / EBS / 3* 145.80 + 4x231
首先应该匹配145.80和231.30 第二个应该匹配145.80和231.00 第三个应该匹配145.80和231以及可能" 4x"和" 3x" 第四个是* AND x
的第三个有没有办法用正则表达式做到这一点?
//编辑(澄清) 我想最后得到一笔总额。所以第三和第四种情况是(3 * 145.80)+(4 * 231)。第二种情况故意是145,80而不是145.80。
到目前为止我得到了什么
(([0-9])*?\.([0-9])*)|(([0-9])*?\,([0-9])*)
这将给我236,30,187.75,145.80,145,80
答案 0 :(得分:1)
假设你输入1 * [VALUE]这样的输入很好,我相信以下内容会捕获所有数字语句:
(\ d [x *]?)?\ d +([。,] \ d +)?(?![* x])
以下是细分:
(\ d [x *]?)?
捕获可选的乘数
\ d +([。,] \ d +)?
需要数值,带有可选的十进制值
(?![* X])
使用否定查找将独立乘数无效为可接受的值(例如,将1x与值1匹配)。
希望我没有错过任何东西。
答案 1 :(得分:1)
from re import findall
examples = ('REG / SZ / 236,30 SUMMER', \
'WB / SZ / 187.75 EBS', \
'FS / EBS / 1*145.80 + 231.30', \
'FS / EBS / 1x 145,80 + 231', \
'FS / EBS / 3x 145.80 + 4x231', \
'FS / EBS / 3* 145.80 + 4x231')
for line in examples:
numbers = findall(r'[/+]\s*(?:(\d+[.,]?\d*)[*x ]\s*)?(\d+[.,]?\d*)', line)
result = 0.0
for multiplier, value in numbers:
if not multiplier:
result += float(value.replace(',', '.'))
else:
result += float(multiplier) * float(value.replace(',', '.'))
print '%s\nAfter regex: %s\nResult: %.2f\n' % (line, numbers, result)
产生结果:
REG / SZ / 236,30 SUMMER
After regex: [('', '236,30')]
Result: 236.30
WB / SZ / 187.75 EBS
After regex: [('', '187.75')]
Result: 187.75
FS / EBS / 1*145.80 + 231.30
After regex: [('1', '145.80'), ('', '231.30')]
Result: 377.10
FS / EBS / 1x 145,80 + 231
After regex: [('1', '145,80'), ('', '231')]
Result: 376.80
FS / EBS / 3x 145.80 + 4x231
After regex: [('3', '145.80'), ('4', '231')]
Result: 1361.40
FS / EBS / 3* 145.80 + 4x231
After regex: [('3', '145.80'), ('4', '231')]
Result: 1361.40
答案 2 :(得分:0)
为什么不简化它并使用正则表达式捕获尾随最后/
(?<=\/)\s[\dx\*\+\.\,\s]+
它会给出所有数字部分,然后你必须评估表达式。