Respostas:
Você não precisa de expressões regulares. O Python possui um método de string interno que faz o que você precisa:
mystring.replace(" ", "_")
Substituir espaços é bom, mas eu sugiro ir um pouco mais além para lidar com outros caracteres hostis à URL, como pontos de interrogação, apóstrofes, pontos de exclamação etc.
Observe também que o consenso geral entre os especialistas em SEO é que os traços são preferidos aos sublinhados nos URLs.
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!"))
O Django tem uma função 'slugify' que faz isso, assim como outras otimizações amigáveis à URL. Está escondido no módulo defaultfilters.
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Esta não é exatamente a saída solicitada, mas o IMO é melhor para uso em URLs.
Isso leva em conta caracteres em branco que não sejam espaço e acho que é mais rápido do que usar o re
módulo:
url = "_".join( title.split() )
\x8f
)
Usando o re
módulo:
import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And so\tshould this') # And_so_should_this
A menos que você tenha vários espaços ou outras possibilidades de espaços em branco, como acima, você pode apenas usar string.replace
como outros sugeriram.
Surpreendentemente, essa biblioteca ainda não mencionada
pacote python chamado python-slugify, que faz um bom trabalho slugifying:
pip install python-slugify
Funciona assim:
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")
Estou usando o seguinte trecho de código para meus URLs amigáveis:
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
Também funciona bem com caracteres unicode.
O Python possui um método interno em strings chamado replace, que é usado da seguinte maneira:
string.replace(old, new)
Então você usaria:
string.replace(" ", "_")
Eu tive esse problema há algum tempo e escrevi código para substituir caracteres em uma string. Preciso começar a me lembrar de verificar a documentação do python, porque eles têm funções incorporadas para tudo.
O OP está usando python, mas em javascript (algo para ter cuidado, pois as sintaxes são semelhantes.
// 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"
Você pode tentar isso:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Corresponder e substituir espaço> sublinhado de todos os arquivos no diretório atual
slugify
não fornece a saída desejada.