Python: Как сопоставить вложенные скобки с регулярным выражением? - PullRequest
12 голосов
/ 28 марта 2011

Я пытаюсь сопоставить строку, похожую на математическое выражение, со вложенными скобками.

import re

p = re.compile('\(.+\)')
str = '(((1+0)+1)+1)'
print p.findall(s)

['(((1 + 0) +1) +1)']

Я хотел, чтобы оно совпадало со всеми вложенными выражениями, такими как (1 + 0), ((1 + 0) +1) ...
Мне даже все равно,он соответствует нежелательным, таким как (((1 + 0), я могу позаботиться о них.

Почему он этого не делает, и как я могу это сделать?

Ответы [ 13 ]

0 голосов
/ 28 марта 2011

Вы можете использовать регулярные выражения, но вам нужно сделать рекурсию самостоятельно. Что-то вроде следующего делает свое дело (если вам нужно только найти, как говорит ваш вопрос, все выражения, заключенные в скобки):

import re

def scan(p, string):
    found = p.findall(string)
    for substring in found:
        stripped = substring[1:-1]
        found.extend(scan(p, stripped))
    return found

p = re.compile('\(.+\)')
string = '(((1+0)+1)+1)'
all_found = scan(p, string)
print all_found

Однако этот код не соответствует «правильным» скобкам. Если вам нужно сделать это, вам лучше воспользоваться специализированным парсером.

0 голосов
/ 28 марта 2011

Я полагаю, что эта функция может удовлетворить ваши потребности, я быстро скомбинировал ее, поэтому не стесняйтесь немного ее почистить.Когда вы делаете гнезда, легко думать об этом задом наперед и работать оттуда =]

def fn(string,endparens=False):
    exp = []
    idx = -1
    for char in string:
        if char == "(":
            idx += 1
            exp.append("")
        elif char == ")":
            idx -= 1
            if idx != -1:
                exp[idx] = "(" + exp[idx+1] + ")"
        else:
            exp[idx] += char
    if endparens:
        exp = ["("+val+")" for val in exp]
    return exp
0 голосов
/ 28 марта 2011

Вы должны написать правильный синтаксический анализатор для парсинга такого выражения (например, с помощью pyparsing). Регулярные выражения не подходят для написания приличных парсеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...