Réponses:
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 les espaces est bien, mais je pourrais suggérer d'aller un peu plus loin pour gérer d'autres caractères hostiles aux URL comme les points d'interrogation, les apostrophes, les points d'exclamation, etc.
Notez également que le consensus général parmi les experts SEO est que les tirets sont préférés aux soulignés 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 fait cela, ainsi que d'autres optimisations compatibles avec 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, il est préférable de l'utiliser dans les URL.
Cela prend en compte les caractères vides autres que l'espace et je pense que c'est plus rapide que d'utiliser le re
module:
url = "_".join( title.split() )
\x8f
)
Utilisation du re
module:
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 d'autres possibilités d'espaces comme ci-dessus, vous pouvez simplement utiliser string.replace
comme d'autres l'ont suggéré.
Étonnamment, cette bibliothèque n'est pas encore mentionnée
package 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")
J'utilise le code suivant pour mes URL conviviales:
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.
Python a une méthode intégrée sur les chaînes appelée replace qui est utilisée comme suit:
string.replace(old, new)
Vous utiliseriez donc:
string.replace(" ", "_")
J'ai eu ce problème il y a quelque temps et j'ai écrit du code pour remplacer les caractères d'une chaîne. Je dois commencer à me rappeler de vérifier la documentation de python car ils ont des fonctions intégrées pour tout.
OP utilise python, mais en javascript (quelque chose à faire attention car 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' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Match and replace space> soulignement de tous les fichiers du répertoire courant
slugify
ne donne pas la sortie souhaitée.