Jawaban:
Anda tidak perlu ekspresi reguler. Python memiliki metode string bawaan yang melakukan apa yang Anda butuhkan:
mystring.replace(" ", "_")
Mengganti spasi baik-baik saja, tetapi saya mungkin menyarankan untuk sedikit lebih jauh menangani karakter URL-bermusuhan lainnya seperti tanda tanya, apostrof, poin seru, dll.
Perhatikan juga bahwa konsensus umum di antara para pakar SEO adalah bahwa tanda hubung lebih disukai daripada garis bawah pada 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!"))
Django memiliki fungsi 'slugify' yang melakukan hal ini, serta optimisasi ramah URL lainnya. Tersembunyi di modul defaultfilters.
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Ini bukan output yang Anda minta, tetapi IMO lebih baik untuk digunakan dalam URL.
Ini memperhitungkan karakter kosong akun selain spasi dan saya pikir ini lebih cepat daripada menggunakan remodul:
url = "_".join( title.split() )
\x8f)
Menggunakan remodul:
import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And so\tshould this') # And_so_should_this
Kecuali jika Anda memiliki beberapa ruang atau kemungkinan spasi putih seperti di atas, Anda mungkin hanya ingin menggunakan string.replaceseperti yang disarankan orang lain.
Anehnya perpustakaan ini belum disebutkan
Paket python bernama python-slugify, yang melakukan pekerjaan slugifying dengan cukup baik:
pip install python-slugify
Bekerja seperti ini:
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")
Saya menggunakan potongan kode berikut untuk url ramah saya:
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
Ini berfungsi dengan baik dengan karakter unicode juga.
Python memiliki metode bawaan pada string yang disebut replace yang digunakan sebagai berikut:
string.replace(old, new)
Jadi, Anda akan menggunakan:
string.replace(" ", "_")
Saya punya masalah ini beberapa waktu yang lalu dan saya menulis kode untuk mengganti karakter dalam sebuah string. Saya harus mulai mengingat untuk memeriksa dokumentasi python karena mereka memiliki fungsi bawaan untuk semuanya.
OP menggunakan python, tetapi dalam javascript (sesuatu yang harus diperhatikan karena sintaksinya mirip.
// 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"
Anda dapat mencoba ini sebagai gantinya:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Cocokkan dan ganti ruang> garis bawah semua file dalam direktori saat ini
slugifytidak memberikan output yang diinginkan.