Je souhaite remplacer les espaces par un trait de soulignement dans une chaîne pour créer des URL agréables. Alors que par exemple:
"This should be connected" becomes "This_should_be_connected"
J'utilise Python avec Django. Peut-on résoudre ce problème en utilisant des expressions régulières?
Vous n'avez pas besoin d'expressions régulières. Python a une méthode de chaîne intégrée qui fait ce dont vous avez besoin:
mystring.replace(" ", "_")
Remplacer des espaces, c'est bien, mais je pourrais suggérer d'aller un peu plus loin pour gérer d'autres caractères hostiles aux URL, tels que des points d'interrogation, des apostrophes, des points d'exclamation, etc.
Notez également que le consensus général des experts en référencement est que les tirets sont préférés aux caractères de soulignement dans les 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 a une fonction 'slugify' qui le fait, ainsi que d'autres optimisations conviviales pour les URL Il est caché dans le module defaultfilters.
>>> from Django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Ce n'est pas exactement le résultat que vous avez demandé, mais IMO est préférable pour une utilisation dans les URL.
Ceci prend en compte les caractères vides autres que l'espace et je pense que c'est plus rapide que d'utiliser le module re
url = "_".join( title.split() )
En utilisant le module 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
À moins que vous n'ayez plusieurs espaces ou autres possibilités d'espaces blancs comme ci-dessus, vous pouvez simplement utiliser string.replace
comme l'ont suggéré d'autres.
utiliser la méthode de remplacement de string:
"this should be connected".replace(" ", "_")
"this_should_be_disconnected".replace("_", " ")
J'utilise le code suivant pour mes urls amicales:
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
Cela fonctionne aussi bien avec les caractères Unicode.
Étonnamment cette bibliothèque pas encore mentionnée
le paquet python nommé python-slugify, qui fait un très bon travail de slugification:
pip install python-slugify
Fonctionne comme ceci:
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")
Python a une méthode intégrée dans les chaînes appelée replace qui est utilisée comme suit:
string.replace(old, new)
Donc, vous utiliseriez:
string.replace(" ", "_")
J'ai eu ce problème il y a quelque temps et j'ai écrit du code pour remplacer des caractères dans une chaîne. Je dois commencer à me souvenir de consulter la documentation Python car ils ont des fonctions intégrées pour tout.
mystring.replace (" ", "_")
si vous affectez cette valeur à une variable, cela fonctionnera
s = mystring.replace (" ", "_")
par défaut mystring n'aura pas cette
OP utilise python, mais en javascript (attention, les syntaxes sont similaires).
// 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"
Vous pouvez essayer ceci à la place:
mystring.replace(r' ','-')