Найти текст, содержащийся во внешних скобках в математическом выражении - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь найти текст, содержащийся во внешних скобках функции, filta ().

Функция является частью строки математического выражения:

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_expr).Однако регулярное выражение возвращает:

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

Может ли кто-нибудь помочь мне?Я новичок в регулярных выражениях и не знаю, что еще попробовать.Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Если вы используете модуль регулярных выражений, который поддерживает рекурсивные шаблоны, вы можете использовать

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

Вывод:

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

https://regex101.com/r/oclWxx/1

  • \( - ведущие скобки
  • ((?:[^()]+|(?R))+) - группа захвата, которая постоянно совпадает:
    • [^()]+ - все, кроме скобок, или
    • (?R) - всешаблон, повторяется снова
  • \) - конечные скобки
1 голос
/ 17 апреля 2019

Так же, как действительно простая альтернатива

>>> 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)']
0 голосов
/ 17 апреля 2019

Я закодировал это, используя стековый подход. Он просто помещает ( в стек, а затем выскакивает из него, когда вы видите ).

math_expr = "filt(2*A) + filt(A*(B+C)) - filt((A+B)/(C+D))"
stack = []
index = 0
overallresult = []
while (index < len(math_expr)):
    if math_expr[index] == '(':
        stack.append('(')
        result = ''
        index +=1
        while(index<len(math_expr) and len(stack)>0):
            result += math_expr[index]
            if(math_expr[index]=='('):
                stack.append('(')
            elif (math_expr[index]==')'):
                stack.pop()
            index+=1
        overallresult.append(result[:-1])
    index+=1
print(overallresult)

OUTPUT

['2*A', 'A*(B+C)', '(A+B)/(C+D)']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...