Yanıtlar:
Normal ifadelere ihtiyacınız yok. Python, ihtiyacınız olanı yapan yerleşik bir dize yöntemine sahiptir:
mystring.replace(" ", "_")
Boşlukları değiştirmek iyidir, ancak soru işaretleri, kesme işaretleri, ünlem işaretleri vb.Gibi diğer URL düşmanca karakterleri işlemek için biraz daha ileri gitmenizi önerebilirim.
Ayrıca SEO uzmanları arasındaki genel fikir birliği, tire'lerin URL'lerde alt çizgilere tercih edildiğini unutmayın.
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'nun bunu yapan bir 'slugify' işlevi ve diğer URL dostu optimizasyonlar vardır. Varsayılan filtreler modülünde gizlidir.
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Bu tam olarak istediğiniz çıktı değildir, ancak IMO URL'lerde kullanmak daha iyidir.
Bu boşluk dışındaki boş karakterleri dikkate alır ve re
modül kullanmaktan daha hızlı olduğunu düşünüyorum :
url = "_".join( title.split() )
\x8f
)
re
Modülü kullanma :
import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And so\tshould this') # And_so_should_this
Yukarıdaki gibi birden fazla alanınız veya diğer boşluk olanaklarınız yoksa, string.replace
diğerlerinin önerdiği gibi kullanmak isteyebilirsiniz .
Şaşırtıcı bir şekilde bu kütüphane henüz bahsedilmedi
Slugifying'ın oldukça iyi bir işini yapan python-slugify adlı python paketi:
pip install python-slugify
Şöyle çalışır:
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")
Dost URL'lerim için aşağıdaki kod parçasını kullanıyorum:
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
Unicode karakterlerle de iyi çalışır.
Python'un şu şekilde kullanılan replace adı verilen dizelerde yerleşik bir yöntemi vardır:
string.replace(old, new)
Yani şunu kullanırsınız:
string.replace(" ", "_")
Bir süre önce bu sorun vardı ve bir dize karakterleri değiştirmek için kod yazdı. Python belgelerini kontrol etmeyi hatırlamaya başlamalıyım çünkü her şey için fonksiyonlar var.
OP python kullanıyor, ancak javascript'te (sözdizimleri benzer olduğundan dikkat edilmesi gereken bir şey).
// 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"
Bunun yerine bunu deneyebilirsiniz:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Match et replace space> geçerli dizindeki tüm dosyaların alt çizgisi
slugify
istenen çıktıyı vermez.