您好,我正在制作一个程序,它将从 Skype 获取诸如 !math(5+5) 之类的命令并返回结果,我在正确使用正则表达式时遇到了问题,我一直在阅读文档,但我无法正确理解。
我试图支持所有运算符,所以 、*/、+、-、% 和 **。当我尝试使用 ** 时,问题来了,要么我使用一个正则表达式并失去指数选项,要么只有指数选项。
这是我的表达方式:
expr = re.search(r'((\d+)(\s*.?|.*\**)(\d+))', 'math(500**1000)')
然后我使用组解析它,
build_expr = {
'number1': int(expr.group(2)),
'operator': expr.group(3),
'number2': int(expr.group(4))
}
为 reseach 模块提供指数参数的结果:
>>> expr.group()
'500**1000'
>>> expr.group(1)
'500**1000'
>>> expr.group(2)
'500'
>>> expr.group(3)
'**100'
它可以很好地处理 1 个字符串,例如 math(500+1000)
>>> expr.group(1)
'500+1000'
>>> expr.group(2)
'500'
>>> expr.group(3)
'+'
>>> expr.group(4)
'1000'
这是整个函数
def math_func(expr_arg):
expr = re.search(r'((\d+)(\s*.?|.*\**)(\d+))', expr_arg)
#parse_expr = ' '.join(expr.group()).split()
build_expr = {
'number1': int(expr.group(2)),
'operator': expr.group(3),
'number2': int(expr.group(4))
}
if build_expr['operator'] == '+':
operation = build_expr['number1'] + build_expr['number2']
return str(operation)
elif build_expr['operator'] == '-':
operation = build_expr['number1'] - build_expr['number2']
return str(operation)
elif build_expr['operator'] == '/':
operation = build_expr['number1'] / build_expr['number2']
return str(operation)
elif build_expr['operator'] == '%':
operation = build_expr['number1'] % build_expr['number2']
return str(operation)
elif build_expr['operator'] == '*':
operation = build_expr['number1'] * build_expr['number2']
return str(operation)
elif build_expr['operator'] == '**':
operation = build_expr['number1'] ** build_expr['number2']
return str(operation)
else:
return 'Invalid operator'
return 'shes all good son'
f = math_func('math(500+1000)')
Message.Chat.SendMessage('>> ' + f)
请您参考如下方法:
可以通过以下方式匹配:
(\d+)\s*([-+*/%]+)\s*(\d+)
分割:
(\d+)将匹配一位或多位数字\s*将匹配空格,如果有的话([-+*/%]+)将匹配一个或多个运算符字符
