Как удалить первый закрытый парен и последний открытый в предложении с помощью регулярных выражений? - PullRequest
1 голос
/ 12 июля 2019

Мне нужно избавиться от ложных паренов.Вот пример предложения:

s = "trees 1) whatever ( goor brc ) the content ( and bad now."

Мне нужно удалить из него только первые ) и последние (.

Мой код не работает, потому что я использую недопустимый синтаксис.Тем не менее, на некоторых языках было бы неплохо, вероятно:

re.sub("(?<=^.*?)\)|(?<=.*)\(", "", s)

Как это выполнить?

EDIT

Это регулярное выражение, вероятно, соответствует первому ): (?:)\) Это работает на regex101, но с s = re.sub("(?:\)){1}", "", s) удаляет все ).

Я нашел, может быть, не очень элегантное решение, но работает:

bos = [m.start() for m in re.finditer("\(", s)]
        bcs = [m.start() for m in re.finditer("\)", s)]
        if min(bcs) < min(bos):
            s = s[:min(bcs)] + s[(min(bcs)+1):]
        bos = [m.start() for m in re.finditer("\(", s)]
        bcs = [m.start() for m in re.finditer("\)", s)]
        if max(bos) > max(bcs):
            s = s[:max(bos)] + s[(max(bos)+1):]

1 Ответ

1 голос
/ 12 июля 2019

Я предполагаю, что это выражение

(\([^)]+\))|([()]+)

может работать до некоторой степени, хотя и не уверен.

Тест с re.sub

import re

regex = r"(\([^)]+\))|([()]+)"

test_str = "trees 1) whatever ( goor brc ) the content ( and bad now. trees 1) whatever ( goor brc ) the content ( and bad now. trees 1) whatever ( goor brc ) the content ( and bad now. the content ( and bad now. the content ( and bad now.the content (((( and bad now. (((("

subst = "\\1"

result = re.sub(regex, subst, test_str)
result = re.sub(r"\s{2,}", " ", result)
print (result)

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите изучить / упростить / изменить ее,а в по этой ссылке вы можете посмотреть, как она будет шаг за шагом сопоставляться с некоторыми примерами входных данных, если хотите.

Отказ

Это не удастся для таких образцов .

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