Поиск текста, содержащегося в крайних круглых скобках в математическом выражении

#python #regex #python-3.x

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

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

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

Комментарии:

1. Не используйте регулярные выражения используйте стек, который лучше и проще

2. Будут ли какие-либо пробелы в вашем выражении внутри () ?

3. @AlbinPaul Используя движок, поддерживающий рекурсивные шаблоны, я думаю, что использование регулярного выражения для чего-то подобного просто отлично, и на самом деле предпочтительнее, если это можно сделать кратко, что он может.

4. @CodeManiac Мне нравится ход твоих мыслей. Возникла та же идея.

Ответ №1:

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

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

Вывод:

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

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

  • ( — Ведущие круглые скобки
  • ((?:[^()] |(?R)) ) — Захват группы, которая неоднократно совпадает:
    • [^()] — Что угодно, кроме круглых скобок, или
    • (?R) — Весь шаблон, повторяется снова
  • ) — Завершающие круглые скобки

Ответ №2:

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

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

Ответ №3:

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

 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)
 

ВЫВОД

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