urls template python regex django

python - template - ¿Cómo reemplazo los espacios en blanco con guión bajo y viceversa?



django urls path (13)

Quiero reemplazar el espacio en blanco con guión bajo en una cadena para crear buenas URL. Para que, por ejemplo:

"This should be connected" becomes "This_should_be_connected"

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


Django tiene una función ''slugify'' que hace esto, así como otras optimizaciones optimizadas para las URL. Está escondido en el módulo defaultfilters.

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

Este no es exactamente el resultado que solicitó, pero IMO es mejor para usar en las URL.


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

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


Estoy usando la siguiente pieza de código para mis URLs amigas:

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 caracteres Unicode también.


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

mystring.replace(" ", "_")


OP usa python, pero en javascript (algo a tener cuidado ya que las sintaxis 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"


Puedes probar esto en su lugar:

mystring.replace(r'' '',''-'')


Python tiene un método integrado en cadenas llamado replace que se usa como tal:

string.replace(old, new)

Entonces usarías:

string.replace(" ", "_")

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


Reemplazar espacios está bien, pero podría sugerir ir un poco más lejos para manejar otros caracteres hostiles a las 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 de SEO es que los guiones son preferibles a los subrayados en las URL.

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!")


Sorprendentemente, esta biblioteca no se ha mencionado aún

paquete python llamado python-slugify, que hace un muy buen trabajo de slugifying:

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")


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 múltiples espacios u otras posibilidades de espacio en blanco como las de arriba, puede desear utilizar string.replace como otros han sugerido.


use el método de reemplazo de cadena:

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

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


mystring.replace (" ", "_")

si asigna este valor a cualquier variable, funcionará

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

por defecto mystring no tendrá esto


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

Match et replace space> guión bajo de todos los archivos en el directorio actual