Skip to main content
 首页 » 编程设计

Python 和正则表达式

2024年08月27日29lhb25

您好,我正在制作一个程序,它将从 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* 将匹配空格,如果有的话
  • ([-+*/%]+) 将匹配一个或多个运算符字符