web-dev-qa-db-fra.com

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

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? 

153
Lucas

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(" ", "_")
268
rogeriopvl

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

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.

39
Daniel Roseman

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() )
29
xOneca

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.

15
Jarret Hardie

utiliser la méthode de remplacement de string:

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

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

10
mdirolf

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.

4
Armandas

É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") 
3
Yash

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.

3
Ionis
mystring.replace (" ", "_")

si vous affectez cette valeur à une variable, cela fonctionnera

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

par défaut mystring n'aura pas cette

1
Rajesh

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"
1
twmulloy

Vous pouvez essayer ceci à la place:

mystring.replace(r' ','-')
0
Meghaa Yadav