Python удаляет внутренние скобки и сохраняет внешние скобки

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

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 без регулярных выражений?


person Isbister    schedule 17.02.2017    source источник
comment
Regex не так хорош для работы с вложенностью.   -  person khelwood    schedule 17.02.2017
comment
Где вы берете текст с этими скобками для начала?   -  person Blender    schedule 17.02.2017
comment
Я сделал теги именованных объектов. Имена помечены [ ] вокруг них. Итак, в этом случае теггер полагает, что у нас есть 3 разных сущности, поскольку Дональд — это сущность, Трамп — это сущность, а Дональд Трамп — еще одна сущность. Это особый случай, когда в начале текста могло быть упомянуто «Дональд», а в середине — «Трамп», а в конце — новое сочетание «Дональд Трамп».   -  person Isbister    schedule 17.02.2017


Ответы (3)


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

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

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

person tripleee    schedule 17.02.2017

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

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

person Matt Fortier    schedule 17.02.2017

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'

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

person Kent    schedule 17.02.2017
comment
Круто, да, это решает этот конкретный случай. Я недостаточно детализировал свои примеры. Поскольку они могут выглядеть так: я думаю, что [Дональд] — это имя президента [Трампа], но некоторые люди называют его [[Дональд] [Трамп]], поэтому его следует звать [[Дональд] [Трамп]] Я обновлю мой вопрос. - person Isbister; 17.02.2017