Как заменить пробелы подчеркиванием и наоборот? - PullRequest
171 голосов
/ 17 июня 2009

Я хочу заменить пробел на подчеркивание в строке, чтобы создать красивые URL. Так что например:

"This should be connected" becomes "This_should_be_connected" 

Я использую Python с Django. Можно ли это решить с помощью регулярных выражений?

Ответы [ 13 ]

291 голосов
/ 17 июня 2009

Вам не нужны регулярные выражения. В Python есть встроенный строковый метод, который делает то, что вам нужно:

mystring.replace(" ", "_")
65 голосов
/ 17 июня 2009

Замена пробелов - это хорошо, но я мог бы предложить пойти немного дальше для обработки других враждебных 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!"))
39 голосов
/ 17 июня 2009

Django имеет функцию 'slugify', которая делает это, а также другие оптимизированные для URL оптимизации. Он скрыт в модуле defaultfilters.

>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")

this-should-be-connected

Это не совсем вывод, который вы запрашивали, но IMO лучше использовать в URL.

33 голосов
/ 30 апреля 2012

При этом учитываются пустые символы, кроме пробела, и я думаю, что это быстрее, чем при использовании модуля re:

url = "_".join( title.split() )
16 голосов
/ 17 июня 2009

Использование модуля 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, как предлагали другие.

10 голосов
/ 17 июня 2009

использовать метод замены строки:

"this should be connected".replace(" ", "_")

"this_should_be_disconnected".replace("_", " ")

5 голосов
/ 17 июня 2009

Я использую следующий фрагмент кода для своих дружественных 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

Отлично работает и с символами Юникода.

4 голосов
/ 28 сентября 2015

Удивительно, но эта библиотека еще не упомянута

пакет 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") 
4 голосов
/ 18 июня 2009

Python имеет встроенный метод для строк, называемый replace, который используется следующим образом:

string.replace(old, new)

Так что вы бы использовали:

string.replace(" ", "_")

У меня была эта проблема некоторое время назад, и я написал код для замены символов в строке. Я должен начать вспоминать, чтобы проверить документацию по Python, потому что у них есть встроенные функции для всего.

3 голосов
/ 31 июля 2016
mystring.replace (" ", "_")

если вы присвоите это значение любой переменной, оно будет работать

s = mystring.replace (" ", "_")

по умолчанию mystring не будет иметь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...