En la cuerda

my_string = 'abcd (ef gh ) ij'

Necesito eliminar los espacios solo cuando aparecen entre paréntesis, lo que resulta en:

my_clean_string = 'abcd (efgh) ij'

Esta publicación sugiere cómo eliminar todos los paréntesis texto completamente a través de re.sub(r'\([^)]*\)', '', my_string), sin embargo, no sé cómo especificar la eliminación solo se debe aplicar a los espacios en blanco ' '.

¿Existe una solución regexpr (o python simple) que haga esto sin recorrer cada carácter expresamente?

3
Pythonic 14 ene. 2017 a las 15:41

4 respuestas

La mejor respuesta

Aquí hay una forma general que funcionará también para paréntesis anidados:

In [27]: my_string = 'abcd (  ()e(e w  )f ) gh'

In [28]: re.sub(r' \(\s+|\s+\)', lambda x: x.group().strip(), my_string)
Out[28]: 'abcd(()e(e w)f) gh'

Si desea eliminar espacios incluso entre palabras, puede jugar con recorridos; -):

In [40]: my_string = 'abcd (  ()e(e w  )f ) gh'

In [41]: re.sub(r'\s+(?=[^[\(]*\))|((?<=\()\s+)', '', my_string)
Out[41]: 'abcd (()e(ew)f) gh'
2
Kasramvd 15 ene. 2017 a las 08:33

En relación con esta publicación,

re.sub("\\s+(?=[^()]*\\))", "", my_string)
0
Community 23 may. 2017 a las 12:08

Una solución sin usar regex,

my_string = 'abcd (ef ) gh'
str_to_replace = my_string[my_string.find('(')+1:my_string.find(')')]
out = my_string.replace(str_to_replace,str_to_replace.replace(' ',''))

Resultado

abcd (ef) gh

0
das-g 14 ene. 2017 a las 13:04

Esto eliminará espacios delante y detrás de las palabras dentro del paréntesis.

import re
my_string = 'abcd (   ef dfg dfg  ) gh'
print re.sub('\(\s*(.*?)\s*\)', lambda x: ''.join(x.group().split()), my_string, re.DOTALL)

Salida:

abcd (efdfgdfg) gh
1
MYGz 14 ene. 2017 a las 13:23