Python&常用表达

时间:2014-04-28 12:38:43

标签: python regex python-2.7

您好我正在制作一个程序,它将从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))
}

结果为研究模块提供了带有指数的参数:

>>> 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)

3 个答案:

答案 0 :(得分:1)

可以使用以下方式进行匹配:

(\d+)\s*([-+*/%]+)\s*(\d+)

故障:

  • (\d+)将匹配一个或多个数字
  • \s*将匹配空格,如果有
  • 的话
  • ([-+*/%]+)将匹配一个或多个运算符字符

答案 1 :(得分:1)

如何使用:

(\d+)\s*(\*\*|[+/%*-])\s*(\d+)

[+/%*-]表示"一个字符,一个来自括号内的列表"。

无需将所有内容都包装在捕获组中,整个匹配已存储在group(0)中。

我不确定你是如何到达.*\**所以我无法告诉你这里的错误是什么,但新正则表达式应do the job。< / p>

答案 2 :(得分:1)

假设您只拥有受信任的数据,您只需将math_func替换为eval即可。