Antworten:
Sie brauchen keine regulären Ausdrücke. Python verfügt über eine integrierte Zeichenfolgenmethode, die genau das tut, was Sie benötigen:
mystring.replace(" ", "_")
Das Ersetzen von Leerzeichen ist in Ordnung, aber ich könnte vorschlagen, etwas weiter zu gehen, um andere URL-feindliche Zeichen wie Fragezeichen, Apostrophe, Ausrufezeichen usw. zu behandeln.
Beachten Sie auch, dass der allgemeine Konsens unter SEO-Experten darin besteht, dass Bindestriche den Unterstrichen in URLs vorgezogen 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 sowie andere URL-freundliche Optimierungen. Es ist im Standardfilter-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 es besser für die Verwendung in URLs.
Dies berücksichtigt andere leere Zeichen als Leerzeichen und ich denke, es ist schneller als die Verwendung von re
Modulen:
url = "_".join( title.split() )
\x8f
)
Verwenden des re
Moduls:
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 wie oben über mehrere Leerzeichen oder andere Leerzeichen string.replace
verfügen, möchten Sie diese möglicherweise nur verwenden, wie andere vorgeschlagen haben.
Überraschenderweise wurde diese Bibliothek noch nicht erwähnt
Python-Paket mit dem Namen python-slugify, das ziemlich gute Arbeit beim Slugifizieren 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")
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.
Python verfügt über eine integrierte Methode für Zeichenfolgen namens replace, die wie folgt verwendet wird:
string.replace(old, new)
Sie würden also verwenden:
string.replace(" ", "_")
Ich hatte dieses Problem vor einiger Zeit und schrieb Code, um Zeichen in einer Zeichenfolge zu ersetzen. Ich muss daran denken, die Python-Dokumentation zu überprüfen, da sie Funktionen für alles eingebaut hat.
OP verwendet Python, jedoch in Javascript (etwas, auf das Sie achten müssen, 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' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Übereinstimmen und Ersetzen des Leerzeichens> Unterstrich aller Dateien im aktuellen Verzeichnis
slugify
Gibt nicht die gewünschte Ausgabe.