2009-06-17 98 views
119

我想用字符串中的下劃線替換空格以創建漂亮的URL。例如:如何將下劃線替換爲空格,反之亦然?

"This should be connected" becomes "This_should_be_connected" 

我在Python中使用Django。這可以使用正則表達式來解決嗎?

+0

這怎麼能這樣可以在實現Django模板。有沒有辦法**刪除**空格。有沒有內置的標籤/過濾器來做到這一點? 注意:`slugify`不會給出所需的輸出。 – user1144616 2012-03-12 17:52:22

回答

218

你不需要正則表達式。 Python有一個內置的字符串的方法,做你所需要的:使用

mystring.replace(" ", "_") 
+15

這不適用於其他空格字符,如\ t或非破壞空格。 – 2009-06-17 15:49:26

+10

是的,你是對的,但爲了所問的問題,似乎沒有必要考慮其他空間。 – rogeriopvl 2009-06-17 17:39:12

+1

我需要導入任何東西才能使用?我得到以下錯誤:AttributeError:'builtin_function_or_method'對象沒有屬性'替換' – 2012-10-31 02:23:13

13

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

+0

謝謝,這正是我所要求的。但我同意,「string.replace」似乎更適合我的任務。 – Lucas 2009-06-17 14:59:24

8

使用字符串的替代方法:

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

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

55

更換空間是好的,但我可能會建議去遠一點處理其他網址敵對字符,如問號,省略號,感嘆號積分等

另請注意,搜索引擎優化專家的普遍共識是,dashes are preferred to underscores in URLs.

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!") 
+0

這很有趣。我一定會使用這個建議。 – Lucas 2009-06-17 15:08:15

36

Django中有一個「slugify」函數,這樣做,以及其他URL友好的優化。它隱藏在defaultfilters模塊中。

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

this-should-be-connected 

這不完全是您要求的輸出,但IMO最好在URL中使用。

4

我用下面這段代碼爲我友好的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 

它正常工作與Unicode字符爲好。

2

Python有一個內置的方法就叫做替換字符串被用作這樣:

string.replace(old, new) 

,因此會使用:

string.replace(" ", "_") 

我前一陣子有這個問題,我寫的代碼替換字符串中的字符。我必須開始記住檢查python文檔,因爲它們已經內置了所有功能。

-2
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;' 

匹配等替代空間>在當前目錄

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" 
25

這考慮到比空間等帳戶空白字符,我認爲這是比使用re模塊更快:

url = "_".join(title.split()) 
1

令人驚訝的這個庫沒有提到

Python包命名的python-slugify,這在slugifying做得不錯:

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") 
1
mystring.replace (" ", "_") 

如果您分配該值給任何一個變量,它會默認MyString的工作

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

不會有這種

相關問題