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