Удалить текст между() и [] в python

У меня очень длинная строка текста с () и []. Я пытаюсь удалить символы между круглыми скобками и скобками, но я не могу понять, как это сделать.

Список похож на этот:

x = "This is a sentence. (once a day) [twice a day]"

Этот список не является тем, с чем я работаю, но очень похож и намного короче.

Спасибо за помощь.

Ответ 1

Это должно работать на parens. регулярные выражения будут "потреблять" текст, который он сопоставил, поэтому он не будет работать для вложенных парнеров.

import re
regex = re.compile(".*?\((.*?)\)")
result = re.findall(regex, mystring)

или это найдет один набор парен... просто цикл, чтобы найти больше

start = mystring.find( '(' )
end = mystring.find( ')' )
if start != -1 and end != -1:
  result = mystring[start+1:end]

Ответ 2

Вы можете использовать функцию re.sub.

>>> import re 
>>> x = "This is a sentence. (once a day) [twice a day]"
>>> re.sub("([\(\[]).*?([\)\]])", "\g<1>\g<2>", x)
'This is a sentence. () []'

Если вы хотите удалить [] и(), вы можете использовать этот код:

>>> import re 
>>> x = "This is a sentence. (once a day) [twice a day]"
>>> re.sub("[\(\[].*?[\)\]]", "", x)
'This is a sentence.  '

Важно: этот код не будет работать с вложенными символами

Ответ 3

Запустите этот script, он работает даже с вложенными скобками.
Использует основные логические тесты.

def a(test_str):
    ret = ''
    skip1c = 0
    skip2c = 0
    for i in test_str:
        if i == '[':
            skip1c += 1
        elif i == '(':
            skip2c += 1
        elif i == ']' and skip1c > 0:
            skip1c -= 1
        elif i == ')'and skip2c > 0:
            skip2c -= 1
        elif skip1c == 0 and skip2c == 0:
            ret += i
    return ret

x = "ewq[a [(b] ([c))]] This is a sentence. (once a day) [twice a day]"
x = a(x)
print x
print repr(x)

Просто запустите, вы не запустите его,
Здесь вывод:

>>> 
ewq This is a sentence.  
'ewq This is a sentence.  ' 

Ответ 4

Здесь решение, подобное @pradyunsg answer (оно работает с произвольными вложенными скобками):

def remove_text_inside_brackets(text, brackets="()[]"):
    count = [0] * (len(brackets) // 2) # count open/close brackets
    saved_chars = []
    for character in text:
        for i, b in enumerate(brackets):
            if character == b: # found bracket
                kind, is_close = divmod(i, 2)
                count[kind] += (-1)**is_close # `+1`: open, `-1`: close
                if count[kind] < 0: # unbalanced bracket
                    count[kind] = 0  # keep it
                else:  # found bracket to remove
                    break
        else: # character is not a [balanced] bracket
            if not any(count): # outside brackets
                saved_chars.append(character)
    return ''.join(saved_chars)

print(repr(remove_text_inside_brackets(
    "This is a sentence. (once a day) [twice a day]")))
# -> 'This is a sentence.  '