¿Cómo puedo reemplazar los espacios en blanco con guiones bajos y viceversa?

Quiero reemplazar los espacios en blanco con un guión bajo en una cadena para crear URL agradables. Así que por ejemplo:

"This should be connected" becomes "This_should_be_connected" 

Estoy usando Python con Django. ¿Se puede resolver esto usando expresiones regulares?

No necesitas expresiones regulares. Python tiene un método de cadena incorporado que hace lo que necesitas:

 mystring.replace(" ", "_") 

Reemplazar espacios está bien, pero podría sugerir ir un poco más lejos para manejar otros caracteres hostiles a URL como signos de interrogación, apóstrofes, signos de exclamación, etc.

También tenga en cuenta que el consenso general entre los expertos en SEO es que se prefieren los guiones para subrayar en las URL.

 import re def urlify(s): # Remove all non-word characters (everything except numbers and letters) s = re.sub(r"[^\w\s]", '', s) # Replace all runs of whitespace with a single dash s = re.sub(r"\s+", '-', s) return s # Prints: I-cant-get-no-satisfaction" print(urlify("I can't get no satisfaction!")) 

Django tiene una función ‘slugify’ que hace esto, así como otras optimizaciones compatibles con URL. Está oculto en el módulo de filtros por defecto.

 >>> from django.template.defaultfilters import slugify >>> slugify("This should be connected") this-should-be-connected 

Esta no es exactamente la salida que solicitó, pero IMO es mejor para su uso en URL.

Esto toma en cuenta los caracteres en blanco que no sean espacio y creo que es más rápido que usar re modulo:

 url = "_".join( title.split() ) 

Usando el módulo re :

 import re re.sub('\s+', '_', "This should be connected") # This_should_be_connected re.sub('\s+', '_', 'And so\tshould this') # And_so_should_this 

A menos que tenga espacios múltiples u otras posibilidades de espacio en blanco como se string.replace anteriormente, es posible que solo desee usar string.replace como otros lo han sugerido.

use el método de reemplazar la cadena

"this should be connected".replace(" ", "_")

"this_should_be_disconnected".replace("_", " ")

Estoy usando el siguiente código para mis URLs amigables:

 from unicodedata import normalize from re import sub def slugify(title): name = normalize('NFKD', title).encode('ascii', 'ignore').replace(' ', '-').lower() #remove `other` characters name = sub('[^a-zA-Z0-9_-]', '', name) #nomalize dashes name = sub('-+', '-', name) return name 

Funciona bien con los personajes de Unicode también.

Python tiene un método incorporado en cadenas llamado reemplazar que se usa como tal:

 string.replace(old, new) 

Así que usarías:

 string.replace(" ", "_") 

Hace un tiempo tuve este problema y escribí código para reemplazar los caracteres en una cadena. Tengo que empezar a recordar revisar la documentación de Python porque tienen funciones integradas para todo.

Sorprendentemente esta biblioteca aún no mencionada

El paquete python llamado python-slugify, que hace un buen trabajo de slugification:

 pip install python-slugify 

Funciona así:

 from slugify import slugify txt = "This is a test ---" r = slugify(txt) self.assertEquals(r, "this-is-a-test") txt = "This -- is a ## test ---" r = slugify(txt) self.assertEquals(r, "this-is-a-test") txt = 'C\'est déjà l\'été.' r = slugify(txt) self.assertEquals(r, "cest-deja-lete") txt = 'Nín hǎo. Wǒ shì zhōng guó rén' r = slugify(txt) self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren") txt = 'Компьютер' r = slugify(txt) self.assertEquals(r, "kompiuter") txt = 'jaja---lol-méméméoo--a' r = slugify(txt) self.assertEquals(r, "jaja-lol-mememeoo-a") 

OP usa python, pero en javascript (algo a tener en cuenta, ya que las syntax son similares).

 // only replaces the first instance of ' ' with '_' "one two three".replace(' ', '_'); => "one_two three" // replaces all instances of ' ' with '_' "one two three".replace(/\s/g, '_'); => "one_two_three" 
 mystring.replace (" ", "_") 

Si asigna este valor a cualquier variable, funcionará

 s = mystring.replace (" ", "_") 

por defecto mystring no tendrá esto

Puedes probar esto en su lugar:

 mystring.replace(r' ','-') 
 perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;' 

Coincidir y reemplazar espacio> subrayado de todos los archivos en el directorio actual