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?
Sie brauchen keine regulären Ausdrücke. Python verfügt über eine integrierte String-Methode, die das tut, was Sie brauchen:
mystring.replace(" ", "_")
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!"))
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.
Dies berücksichtigt andere Leerzeichen als Leerzeichen, und ich denke, es ist schneller als mit dem Modul re
:
url = "_".join( title.split() )
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.
benutze die Ersetzungsmethode von string:
"this should be connected".replace(" ", "_")
"this_should_be_disconnected".replace("_", " ")
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.
Ü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")
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.
mystring.replace (" ", "_")
wenn Sie diesen Wert einer Variablen zuweisen, funktioniert sie
s = mystring.replace (" ", "_")
standardmäßig hat mystring dies nicht
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"
Sie können dies stattdessen versuchen:
mystring.replace(r' ','-')