web-dev-qa-db-de.com

Wie ersetze ich Leerzeichen durch Unterstriche und umgekehrt?

Ich möchte Leerzeichen durch Unterstrich in einer Zeichenfolge ersetzen, um Nice-URLs zu erstellen. So zum Beispiel:

"This should be connected" becomes "This_should_be_connected" 

Ich benutze Python mit Django. Kann das mit regulären Ausdrücken gelöst werden? 

153
Lucas

Sie brauchen keine regulären Ausdrücke. Python verfügt über eine integrierte String-Methode, die das tut, was Sie brauchen:

mystring.replace(" ", "_")
268
rogeriopvl

Leerzeichen zu ersetzen ist in Ordnung, aber ich kann vorschlagen, ein wenig weiterzugehen und andere URL-feindliche Zeichen wie Fragezeichen, Apostrophe, Ausrufezeichen usw. zu behandeln 

Beachten Sie außerdem, dass der allgemeine Konsens unter SEO-Experten darin besteht, dass Bindestriche gegenüber URLs bevorzugt werden.

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 verfügt über eine Slugify-Funktion, die dies sowie andere URL-freundliche Optimierungen ausführt. Es ist im defaultfilters-Modul versteckt.

>>> from Django.template.defaultfilters import slugify
>>> slugify("This should be connected")

this-should-be-connected

Dies ist nicht genau die Ausgabe, nach der Sie gefragt haben, aber IMO ist besser für die Verwendung in URLs geeignet.

39
Daniel Roseman

Dies berücksichtigt andere Leerzeichen als Leerzeichen, und ich denke, es ist schneller als mit dem Modul re:

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

Verwenden des Moduls 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

Sofern Sie nicht mehrere Leerzeichen oder andere Whitespace-Möglichkeiten wie oben haben, möchten Sie vielleicht nur string.replace verwenden, wie von anderen vorgeschlagen.

15
Jarret Hardie

benutze die Ersetzungsmethode von string:

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

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

10
mdirolf

Ich verwende den folgenden Code für meine freundlichen URLs:

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

Es funktioniert auch gut mit Unicode-Zeichen.

4
Armandas

Überraschenderweise wurde diese Bibliothek noch nicht erwähnt

python-Paket mit dem Namen python-slugify, das ziemlich gute Arbeit leistet:

pip install python-slugify

Funktioniert so:

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 hat eine eingebaute Methode für Strings, die als replace bezeichnet wird.

string.replace(old, new)

Also würdest du verwenden:

string.replace(" ", "_")

Ich hatte dieses Problem vor einiger Zeit und ich habe Code geschrieben, um Zeichen in einer Zeichenfolge zu ersetzen. Ich muss daran denken, mir die Python-Dokumentation anzuschauen, da in sie Funktionen für alles eingebaut sind.

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

wenn Sie diesen Wert einer Variablen zuweisen, funktioniert sie

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

standardmäßig hat mystring dies nicht

1
Rajesh

OP verwendet Python, aber in Javascript (etwas, das zu beachten ist, da die Syntax ähnlich ist.

// 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

Sie können dies stattdessen versuchen:

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