Odpowiedzi:
Nie potrzebujesz wyrażeń regularnych. Python ma wbudowaną metodę ciągu, która wykonuje to, czego potrzebujesz:
mystring.replace(" ", "_")
Zastępowanie spacji jest w porządku, ale mogę zasugerować pójście nieco dalej w celu obsługi innych znaków nieprzyjaznych adresom URL, takich jak znaki zapytania, apostrofy, wykrzykniki itp.
Należy również pamiętać, że ogólny konsensus wśród ekspertów SEO jest taki, że kreski są preferowane zamiast znaków podkreślenia w adresach 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 ma funkcję „slugify”, która to robi, a także inne optymalizacje przyjazne adresom URL. Jest ukryty w domyślnym module filtrów.
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Nie jest to dokładnie wynik, o który prosiłeś, ale IMO lepiej jest użyć w adresach URL.
Uwzględnia to puste znaki inne niż spacja i myślę, że jest to szybsze niż użycie re
modułu:
url = "_".join( title.split() )
\x8f
)
Korzystanie z re
modułu:
import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And so\tshould this') # And_so_should_this
O ile nie masz wielu spacji lub innych możliwości białych znaków, jak wyżej, możesz po prostu użyć string.replace
tego, co sugerowali inni.
O dziwo ta biblioteka jeszcze nie wspomniana
pakiet python o nazwie python-slugify, który wykonuje całkiem niezłą robotę:
pip install python-slugify
Działa tak:
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")
Dla moich przyjaznych adresów URL używam następującego kodu:
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
Działa również dobrze ze znakami Unicode.
Python ma wbudowaną metodę ciągów o nazwie replace, która jest używana w następujący sposób:
string.replace(old, new)
Więc użyłbyś:
string.replace(" ", "_")
Miałem ten problem jakiś czas temu i napisałem kod zastępujący znaki w ciągu. Muszę zacząć pamiętać, aby sprawdzić dokumentację Pythona, ponieważ mają one wbudowane funkcje do wszystkiego.
OP używa Pythona, ale w javascript (należy zachować ostrożność, ponieważ składnie są podobne.
// 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"
Możesz spróbować zamiast tego:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Dopasuj i zamień spację> podkreślenie wszystkich plików w bieżącym katalogu
slugify
nie daje pożądanego wyniku.