Ошибка в регулярном выражении, чтобы найти текст в скобках - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть строка

string  ='((clearance) AND (embedded) AND (software engineer OR developer)) AND (embedded)'

Я хочу разбить списки на основе скобок, поэтому ссылаюсь на решения , учитывая, что я использовал

my_data = re.findall(r"(\(.*?\))",string)

, нокогда я печатаю my_data, вывод будет (len = 4)

['((clearance)', '(embedded)', '(software engineer OR developer)', '(embedded)']

, но мой желаемый вывод будет (len = 2)

['(clearance) AND (embedded) AND (software engineer OR developer)', '(embedded)']

потому что "(зазор) AND (встроенный)AND (инженер программного обеспечения ИЛИ разработчик) "в одной круглой скобке, а" внедренный "в другой круглой скобке.но "re.findall" разбивается на 4 списка, почему?

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

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Немного взлома re, но это возможно:

>>> string  ='((clearance) AND (embedded) AND (software engineer OR developer)) AND (embedded)'
>>> [e for e in re.split(r'\((?=\()(.*?)(?<=\))\)|(?<!\()(\([^()]+\))(?!\))',string) if e and '(' in e and ')' in e]
['(clearance) AND (embedded) AND (software engineer OR developer)', '(embedded)']
0 голосов
/ 12 декабря 2018

В чистом регулярном выражении это было бы невозможно, поэтому вот идея, которая учитывает скобки:

def find_stuff(string):
    indices = []
    counter = 0
    change = {"(":1, ")":-1}
    for i, el in enumerate(string):
        new_count = counter + change.get(el, 0)
        if counter==0 and new_count==1:
            indices.append(i)
        elif counter==1 and new_count==0:
            indices.append(i+1)
        counter = new_count
    return indices

Это не очень красиво, но я думаю, что концепция ясна.Он возвращает индексы внешних скобок, так что вы можете просто нарезать вашу строку с помощью этих

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