我正在尝试编写一个正则表达式来解析出七个匹配对象:四个数字和三个操作数:
文件中的各行如下所示:
[ 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,但是如果正则表达式有效则不重要。目标(我认为)是提取七个匹配对象:四个整数和三个操作数,然后添加数字 正如它们出现的那样。括号中的数字只是行号,在计算中不起作用。
答案 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]+)\)
收率: