Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python&;正则表达式_Python_Regex_Python 2.7 - Fatal编程技术网

Python&;正则表达式

Python&;正则表达式,python,regex,python-2.7,Python,Regex,Python 2.7,嗨,我正在制作一个程序,它将接受一个命令,比如!数学(5+5)从skype返回结果,我很难正确使用正则表达式,我一直在阅读文档,但无法正确使用它 我试图支持所有运算符,因此,*/、+、-、%和**。当我尝试使用**时,麻烦就来了,要么我使用一个正则表达式,失去了指数选项,要么只有指数选项 以下是我的表达: expr = re.search(r'((\d+)(\s*.?|.*\**)(\d+))', 'math(500**1000)') 然后我用组来解析它 build_expr = {

嗨,我正在制作一个程序,它将接受一个命令,比如
!数学(5+5)
从skype返回结果,我很难正确使用正则表达式,我一直在阅读文档,但无法正确使用它

我试图支持所有运算符,因此,*/、+、-、%和**。当我尝试使用**时,麻烦就来了,要么我使用一个正则表达式,失去了指数选项,要么只有指数选项

以下是我的表达:

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)

这是整个函数

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*
    将匹配空格(如果有)
  • ([-+*/%]+)
    将匹配一个或多个运算符字符
仅使用以下各项如何:

(\d+)\s*(\*\*|[+/%*-])\s*(\d+)
[+/%*-]
表示“一个字符,括号内列表中的一个字符”

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


我不知道你是怎么做到的,所以我不能告诉你这里有什么错误,但是新的正则表达式应该是这样的。

假设你只有可信的数据,你可以用
eval
替换你的
math\u func
,然后用它来完成。

什么是
*\**
应该匹配的?(\s*?\124;*)假设匹配任何1个字母的字符串或字符串“*”,看起来您正在构建一个解析器。您确定要使用正则表达式吗?如果您想支持复杂(即非规则)操作,如
1+2*3
,正则表达式将阻止您。您对复杂表达式有何建议Google“调车场算法”,请选择链接:-)谢谢您是如何发现的-等待nvm它被破坏不管它如何工作,只是这个skype API太糟糕了NVM原来是我太糟糕了:-)是的,我也不太确定,因为你问我,我很难想出一个response@jeff“这段奇怪的代码是谁写的?哦……我。”我们所有人都遇到了:)
(\d+)\s*(\*\*|[+/%*-])\s*(\d+)