Вы можете использовать регулярное выражение
import re
s = '[Carrots] [Broccoli] (cucumber)-(tomato) irrelevant [spinach]'
lst = [x[0] or x[1] for x in re.findall(r'\[(.*?)\]|\((.*?)\)', s)]
print(lst)
Выход
['Carrots', 'Broccoli', 'cucumber', 'tomato', 'spinach']
Пояснение
Шаблон регулярного выражения для сопоставления
r'\[(.*?)\]|\((.*?)\)'
Подшаблон 1: для сопоставления элементов в квадратных скобках, например [...]
\[(.*?)\] # Use \[ and \] since [, ] are special characters
# we have to escape so they will be literal
(.*?) # Is a Lazy match of all characters
Подшаблон 2: для сопоставления в скобках, т. Е. (..)
\((.*?)\) # Use \( and \) since (, ) are special characters
# we have to escape so they will be literal
Поскольку мы ищем любой из двух шаблонов, которые мы используем:
'|' # which is or between the two subpatterns
# to match Subpattern1 or Subpattern
Выражение
re.findall(r'\[(.*?)\]|\((.*?)\)', s)
[('Carrots', ''), ('Broccoli', ''), ('', 'cucumber'), ('', 'tomato'), ('spinach', '')]
Результат находится в первом или втором кортеже. Поэтому мы используем:
[x[0] or x[1] for x in re.findall(r'\[(.*?)\]|\((.*?)\)', s)]
Чтобы извлечь данные из первого или второго кортежа и поместить их в список.