Estoy luchando con Regex, he leído el wiki y he jugado, pero parece que no puedo hacer la combinación correcta.

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]' 

Quiero eliminar todos los corchetes posibles dentro de los corchetes externos mientras mantengo los corchetes externos y el texto dentro.

¿Podría resolverse esto fácilmente en Python sin expresiones regulares?

1
Isbister 17 feb. 2017 a las 12:00

3 respuestas

La mejor respuesta

En el caso específico de dos expresiones entre corchetes adyacentes dentro de un par de corchetes, puede hacer

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

Esto no se extiende convenientemente a un número arbitrario de expresiones entre paréntesis adyacentes, pero tal vez sea suficiente para sus necesidades.

1
tripleee 17 feb. 2017 a las 10:12

Regex le causará más daño que bien por tales problemas. Deberá escribir alguna lógica de análisis basada en la gramática o las reglas.

Por ejemplo, puede ver Transductores de estado finito (1, 2), que sería un método adecuado para analizar construcciones anidadas, pero es más complejo de entender y usar que Regex.

1
Community 23 may. 2017 a las 12:00
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'

Solo muestre un camino a seguir, se omitió la comprobación / manejo de errores.

0
Kent 17 feb. 2017 a las 10:02