如何用下划线替换空格,反之亦然?

时间:2009-06-17 14:41:37

标签: python regex django

我想用字符串中的下划线替换空格来创建漂亮的URL。例如:

"This should be connected" becomes "This_should_be_connected" 

我正在使用Python和Django。这可以使用正则表达式解决吗?

13 个答案:

答案 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;当前目录中所有文件的下划线