正则表达式提取数字和操作数

时间:2018-02-27 22:36:08

标签: regex python-3.6

我正在尝试编写一个正则表达式来解析出七个匹配对象:四个数字和三个操作数:

文件中的各行如下所示:

[  9]  -21 - ( 12) - (  -5) + ( -26) = ______

括号中的数字是将被忽略的行号。我想要四个整数值,(包括' - '如果它是一个负整数),在这种情况下是-21,12,-5和-26。我也想要操作数,它们是 - , - 和+。

然后我将获取这些值(匹配对象)并实际计算答案:

-21 - 12 - -5 + -26 = -54

我有这个:

[\s+0-9](-?[0-9]+)

在Pythex中,它抓取[9],但它也会在单独的匹配对象中抓取每个整数(另外四个匹配对象)。我不知道为什么会这样做。

如果我加一个?到最后:[\s+0-9](-?[0-9]+)?认为它只会抓住第一个整数,它不会。我得到了17场比赛?

我试图通过正则表达式来说:抓住行号和它的括号(该部分有效),然后抓取第一个整数,包括符号,然后是操作数,然后是包含符号的下一个整数,然后等下一个操作数等。

似乎我没有清楚地解释自己。

该文件有数百行。这是一个五行样本:

[  1]   19 - (   1) - (   4) + (  28) = ______
[  2]  -18 + (   8) - (  16) - (   2) = ______
[  3]   -8 + (  17) - (  15) + ( -29) = ______
[  4]  -31 - ( -12) - (  -5) + ( -26) = ______
[  5]  -15 - (  12) - (  14) - (  31) = ______

操作数只是' - '或者' +',但这三者的任何组合都可能出现在一行中。整数将从-99到99,但是如果正则表达式有效则不重要。目标(我认为)是提取七个匹配对象:四个整数和三个操作数,然后添加数字 正如它们出现的那样。括号中的数字只是行号,在计算中不起作用。

2 个答案:

答案 0 :(得分:1)

如果你只是需要结果,请使用正则表达式:

import re

s="[  9]  -21 - ( 12) - (  -5) + ( -26) = ______"

s = s[s.find("]")+1:s.find("=")]           #  cut away line nr and = ...

if not re.sub( "[+-0123456789() ]*","",s): #  weak attempt to prevent python code injection
    print(eval(s))
else:
    print("wonky chars inside, only numbers, +, - , space and () allowed.")

输出:

-54

请务必阅读eval() 并看看:

数百行的示例

import re

s="[  9]  -21 - ( 12) - (  -5) + ( -26) = ______"


def calcIt(line):
    s = line[line.find("]")+1:line.find("=")] 

    if not re.sub( "[+-0123456789() ]*","",s):
        return(eval(s))
    else:
        print(line + " has wonky chars inside, only numbers, +, - , space and () allowed.")
        return None


import random
random.seed(42)

pattern = "[ {}]  -{} - ( {}) - (  -{}) + ( -{}) = "


for n in range(1000):
    nums = [n]
    nums.extend([ random.randint(0,100),random.randint(-100,100),random.randint(-100,100),
                  random.randint(-100,100)])
    c = pattern.format(*nums)
    print (c, calcIt(c))

答案 1 :(得分:0)

啊......我喝了一杯咖啡,再次坐在Pythex前面。

我找到了正确的正则表达式:

[\s+0-9]\s+(-?[0-9]+)\s+([-|+])\s+\(\s+(-?[0-9]+)\)\s+([-|+])\s+\(\s+(-?[0-9]+)\)\s+([-|+])\s+\(\s+(-?[0-9]+)\)

收率:

  1. -21
  2. -
  3. 12
  4. -
  5. -5
  6. +
  7. -26