Estoy tratando de reemplazar todas las palabras con guiones en cadena con sus versiones separadas. Puedo detectar palabras con guiones, pero no pude reemplazarlas con versiones separadas. ¿Cómo puedo hacer eso?

Este es el ejemplo y un código de muestra:

import re
text = "one-hundered-and-three- some text foo-bar some--text"
re.findall(r'\w+(?:-\w+)+',text)
# returns: ['one-hundered-and-three', 'foo-bar']
# I want to modify text as follows:
#  text_new = "one hundered and three- some text foo bar some--text"
1
zwlayer 15 sep. 2018 a las 21:56

3 respuestas

La mejor respuesta

Puede usar re.sub() con una función para el argumento repl:

In [12]: re.sub(r'\w+(?:-\w+)+', lambda match: match.group(0).replace('-', ' '), text)
Out[12]: 'one hundered and three- some text foo bar some--text'

Lo escribí como una línea aquí, pero creo que sería más claro si la lambda se moviera a una función con nombre.

0
NPE 15 sep. 2018 a las 19:02

Puedes usar un patrón realmente simple:

\b-\b
  • \b Límite de palabras.
  • - Guión.
  • \b Límite de palabras.

Regex demo aquí.


Demo de Python:

import re

text = "one-hundered-and-three- some text foo-bar some--text"
print(re.sub(r'\b-\b', ' ', text))

Huellas:

one hundered and three- some text foo bar some--text
1
UnbearableLightness 15 sep. 2018 a las 19:35

re.sub() con anticipación positiva y posterior:

import re

text = "one-hundered-and-three- some text foo-bar some--text"
print(re.sub(r'(?<=\w)-(?=\w)', ' ', text))

# one hundered and three- some text foo bar some--text
1
Austin 15 sep. 2018 a las 19:02