2017-02-17 4 views
1

Я борюсь с Regex, я прочитал wiki и поиграл, но я не могу сделать правильный матч.Python удаляет внутренние скобки и держит внешние скобки

string_before = 'President [Trump] first name is [Donald], so his full name is [[Donald] [Trump]]' 
string_after = 'President [Trump] first name is [Donald], so his full name is [Donald Trump]' 

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

Может ли это быть легко разрешено в python без регулярного выражения?

+0

Regex не подходит для работы с гнездованием. – khelwood

+0

Где вы получаете текст с этими скобками для начала? – Blender

+0

Я выполнил пометку с именем. И имена помечены [] вокруг них. Таким образом, в этом случае теггер верит, что у нас есть 3 разных сущности, поскольку Дональд является сущностью, Trump является сущностью, а Дональд Трамп - другой сущностью. Это особый случай, когда «Дональд» мог быть упомянут в начале текста и «Трамп» посередине, а затем новая комбинация «Дональд Трамп» в конце. – Isbister

ответ

1

В конкретном случае двух соседних квадратных скобках выражения внутри пары скобок, вы можете сделать

string = re.sub(r'\[\[([^][]+)\] \[([^][]+)\]\]', r'[\1 \2]', string) 

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

1

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

Вы можете, например, взглянуть на преобразователи конечного состояния (1, 2), что было бы подходящим методом анализа вложенных конструкций, но это сложнее, чем Regex для понимания и использования.

0
In [1]: import re 
In [2]: before='blablabla [[Donald] [Trump]] blablabla' 
In [3]: l=before.find('[')+1 
In [4]: r=before.rfind(']') 
In [5]: before[:l] + re.sub(r'[][]','',before[l:r]) + before[r:] 
Out[5]: 'blablabla [Donald Trump] blablabla' 

Просто показать один из способов, проверка ошибок/обработка была опущена.

+0

Прохладный, да, он решает этот конкретный случай. Я недостаточно разбирал свои примеры. Поскольку они могут выглядеть так: «Я думаю, что [Дональд] - это имя президента [Трамп], но некоторые люди называют его [[Дональд] [Трамп]], поэтому его назовут [[Дональд] [Трамп]]« Я обновит мой вопрос. – Isbister

Смежные вопросы