Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 3.x - Fatal编程技术网

Python 查找数学表达式中最外圆括号中包含的文本

Python 查找数学表达式中最外圆括号中包含的文本,python,regex,python-3.x,Python,Regex,Python 3.x,我试图查找包含在函数filt()最外层括号内的文本 该函数是数学表达式字符串的一部分: math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))" 预期产出为: ['2*A', 'A*(B+C)', '(A+B)/(C+D)'] 我在这个网站上尝试过使用几个正则表达式,得到的最接近的结果是使用re.findall('\(.*?)',math\u expr)。但是,正则表达式返回: ['2*A', 'A*(B+C', '(A+B',

我试图查找包含在函数filt()最外层括号内的文本

该函数是数学表达式字符串的一部分:

math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"
预期产出为:

['2*A', 'A*(B+C)', '(A+B)/(C+D)']
我在这个网站上尝试过使用几个正则表达式,得到的最接近的结果是使用
re.findall('\(.*?)',math\u expr)
。但是,正则表达式返回:

['2*A', 'A*(B+C', '(A+B', 'C+D']

谁能帮帮我吗?我对regex还不熟悉,不知道还能尝试什么。谢谢大家!

如果使用支持递归模式的regex模块,则可以使用

regex.findall(r'\(((?:[^()]+|(?R))+)\)', math_expr)
输出:

['2*A', 'A*(B+C)', '(A+B)/(C+D)']

  • \(
    -前括号
  • ((?:[^()]+|(?R))+)
    -捕获组,重复匹配:
    • [^()]+
      -除括号外的任何内容,或
    • (?R)
      -整个模式再次递归
  • \)
    -后面的括号

如果使用支持递归模式的regex模块,则可以使用

regex.findall(r'\(((?:[^()]+|(?R))+)\)', math_expr)
输出:

['2*A', 'A*(B+C)', '(A+B)/(C+D)']

  • \(
    -前括号
  • ((?:[^()]+|(?R))+)
    -捕获组,重复匹配:
    • [^()]+
      -除括号外的任何内容,或
    • (?R)
      -整个模式再次递归
  • \)
    -后面的括号

我使用堆栈方法对其进行了编码。它只是将
放入堆栈中,然后在看到
时从堆栈中弹出)


我使用堆栈方法对其进行了编码。它只是将
放入堆栈中,然后在看到
时从堆栈中弹出)


作为一个非常简单的选择

>>> import re

>>> math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"

>>> re.findall(r'\(([\S]*?)\)(?=\s|$)', math_expr)


#OUTPUT
['2*A', 'A*(B+C)', '(A+B)/(C+D)']

作为一个非常简单的选择

>>> import re

>>> math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"

>>> re.findall(r'\(([\S]*?)\)(?=\s|$)', math_expr)


#OUTPUT
['2*A', 'A*(B+C)', '(A+B)/(C+D)']

不要使用正则表达式使用更好、更容易的堆栈在
()
?@AlbinPaul内的表达式中是否有空格?通过使用支持递归模式的引擎,我认为使用正则表达式来实现类似的功能是很好的,如果可以简洁地实现,实际上更可取,“我喜欢你的思维方式。我也有同样的想法。不要使用正则表达式使用更好更容易的堆栈
()
?@AlbinPaul通过使用支持递归模式的引擎,我认为使用正则表达式来处理类似的事情是很好的,如果可以简洁地完成,实际上更可取,“我喜欢你的思维方式。我也有同样的想法。这里,有一件T恤+1这里,有一件T恤+1