268 votes

Comment remplacer les espaces par des traits de soulignement et vice versa?

Je veux remplacer les espaces par des traits de soulignement dans une chaîne pour créer de belles URL. 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?

463voto

rogeriopvl Points 9619

Vous n'avez pas besoin d'expressions régulières, Python a une méthode de chaîne qui fait ce dont vous avez besoin:

 mystring.replace (" ", "_")
 

99voto

Triptych Points 70247

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 parmi les experts en référencement est que les tirets sont préférés aux soulignés dans les 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!")
 

47voto

xOneca Points 150

Cela 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() )
 

45voto

Daniel Roseman Points 199743

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.

25voto

Jarret Hardie Points 36266

Utilisation du 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 souhaiterez peut-être simplement utiliser string.replace comme d'autres l'ont suggéré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X