具有乘数和各种格式的复杂定价正则表达式

时间:2014-06-09 05:48:05

标签: regex

我正在寻找一个在评论行中查找价格的正则表达式,可以格式不同(取决于输入的人

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

3 个答案:

答案 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]+

它会给出所有数字部分,然后你必须评估表达式。