我想用字符串中的下划线替换空格来创建漂亮的URL。例如:
"This should be connected" becomes "This_should_be_connected"
我正在使用Python和Django。这可以使用正则表达式解决吗?
答案 0 :(得分:288)
您不需要正则表达式。 Python有一个内置的字符串方法,可以满足你的需要:
mystring.replace(" ", "_")
答案 1 :(得分:65)
替换空格很好,但我可能会建议再进一步处理其他URL恶意字符,如问号,撇号,感叹号等。
另请注意,SEO专家的普遍共识是dashes are preferred to underscores in 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!"))
答案 2 :(得分:39)
Django有一个'slugify'功能可以做到这一点,以及其他对URL友好的优化。它隐藏在defaultfilters模块中。
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
这不是您要求的输出,但IMO最好用于URL。
答案 3 :(得分:33)
这考虑了空格以外的空白字符,我认为它比使用re
模块更快:
url = "_".join( title.split() )
答案 4 :(得分:16)
使用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
。
答案 5 :(得分:10)
使用string的替换方法:
"this should be connected".replace(" ", "_")
"this_should_be_disconnected".replace("_", " ")
答案 6 :(得分:5)
我正在使用以下代码来表达我的友好网址:
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字符。
答案 7 :(得分:4)
Python在字符串上有一个内置的方法,名为replace,用法如下:
string.replace(old, new)
所以你会使用:
string.replace(" ", "_")
前一段时间我遇到过这个问题,我编写代码来替换字符串中的字符。我必须开始记得检查python文档,因为它们内置了所有功能。
答案 8 :(得分:4)
令人惊讶的是这个库尚未提及
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")
答案 9 :(得分:3)
mystring.replace (" ", "_")
如果将此值分配给任何变量,它将起作用
s = mystring.replace (" ", "_")
默认情况下mystring不会有这个
答案 10 :(得分:2)
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"
答案 11 :(得分:1)
你可以试试这个:
mystring.replace(r' ','-')
答案 12 :(得分:-2)
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
匹配和替换空间&gt;当前目录中所有文件的下划线