Відповіді:
Вам не потрібні регулярні вирази. У Python є вбудований рядовий метод, який виконує те, що вам потрібно:
mystring.replace(" ", "_")
Заміна пробілів - це добре, але я б запропонував піти трохи далі, щоб обробити інші ворожі URL-адреси, такі як знаки запитання, апострофи, знаки оклику тощо.
Також зауважте, що загальний консенсус серед експертів з SEO полягає в тому, що тире віддають перевагу підкресленням 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 має функцію "slugify", яка це робить, а також інші оптимізації, сприятливі для URL-адрес. Він прихований у модулі фільтра за замовчуванням.
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Це не зовсім вихід, про який ви просили, але IMO краще використовувати в URL-адресах.
При цьому враховуються порожні символи, відмінні від місця, і я думаю, що це швидше, ніж використання re
модуля:
url = "_".join( title.split() )
\x8f
)
Використання 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
Якщо у вас немає декількох пробілів або інших можливостей пробілу, як зазначено вище, ви можете просто використовувати, string.replace
як запропонували інші.
Дивно, але ця бібліотека ще не згадується
Пакет python з ім'ям python-slugify, який виконує досить непогану роботу щодо слугіфікації:
pip install python-slugify
Працює так:
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")
Я використовую такий код у своїх дружніх URL-адресах:
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.
У Python є вбудований метод на рядках під назвою замість, який використовується так:
string.replace(old, new)
Отже, ви б використовували:
string.replace(" ", "_")
У мене ця проблема була деякий час тому, і я написав код, щоб замінити символи в рядку. Я повинен почати згадувати, щоб перевірити документацію python, оскільки вони мають вбудовані функції для всього.
OP використовує python, але у JavaScript (що слід бути обережним, оскільки синтаксиси схожі.
// 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"
Ви можете спробувати це замість цього:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Збіг і заміни пробілу> підкресли всі файли в поточному каталозі
slugify
не дає бажаного результату.