Ответы:
Вам не нужны регулярные выражения. 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 оптимизации. Это скрыто в модуле defaultfilters.
>>> 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
Он отлично работает и с символами Юникода.
В Python есть встроенный метод для строк, называемый replace, который используется следующим образом:
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
не дает желаемого результата.