2010-07-21 30 views
11

我需要將任意字符串轉換爲python中有效變量名稱的字符串。如何將字符串轉換爲Python中的有效變量名?

這裏是一個非常簡單的例子:

s1 = 'name/with/slashes' 
s2 = 'name ' 

def clean(s): 
    s = s.replace('/','') 
    s = s.strip() 
    return s 

print clean(s1)+'_'#the _ is there so I can see the end of the string 

這是一個非常幼稚的做法。我需要檢查字符串是否包含無效的 變量名字符並將其替換爲''

什麼是pythonic方式來執行此操作?

+0

你想用這種方法解決什麼問題?可能有更好的方法。 – Daenyth 2010-07-21 20:06:19

+2

'print repr(「一個字符串」)'顯示引號中的字符串 - 整齊而不是附加'_'。 – 2010-07-21 20:38:00

+0

我從電影院4d遍歷場景圖,需要在攪拌機中重新創建它。爲了便於我理解,我想將cinema4d對象的實際名稱作爲Blender Python的變量名稱,所以我需要先調整這些值。 – 2010-07-21 20:40:19

回答

21

According to Python,標識是字母或下劃線,其次是字母,數字無限串,並強調:

import re 

def clean(s): 

    # Remove invalid characters 
    s = re.sub('[^0-9a-zA-Z_]', '', s) 

    # Remove leading characters until we find a letter or underscore 
    s = re.sub('^[^a-zA-Z_]+', '', s) 

    return s 

使用這樣的:

>>> clean(' 32v2 g #Gmw845h$W b53wi ') 
'v2gGmw845hWb53wi' 
+0

+1中的空格/斜線等,以便識別第一個字母與後續字母的有效字符不同,以及僅允許有效字母與剝離無效字母。 – 2010-07-21 20:40:19

+1

但保留字不能用作變量名稱... – 2010-07-21 20:41:28

+1

@JukkaSuomela有一個很好的觀點。由於所有保留的關鍵字都只有字母,因此可以保證不會因爲添加下劃線而產生衝突(如果您想要真正好,可以先檢查該名稱是否爲關鍵字,並且僅添加下劃線,如果是案件)。 – 2010-07-21 20:54:37

4

您應該構建一個允許使用字符的白名單的正則表達式,並替換不在該字符類中的所有內容。

+7

或者更好的是,建立一個允許的_strings_白名單並將它們鏈接到實際的預定義對象。每當這樣的問題出現時,我都會感到緊張,認爲有人幾乎肯定會寫出一個巨大的安全漏洞。 – 2010-07-21 20:04:32

+0

:)不是我......我只是從電影院4d解析場景圖,需要在攪拌機中重新創建它。動畫師通常不必擔心或不必擔心對象名稱 – 2010-07-21 20:36:38

1

使用re模塊,並去除所有無效的文字記錄器。

30

好吧,我會喜歡以最好的三聯的解決方案...一個單線!

>>> clean = lambda varStr: re.sub('\W|^(?=\d)','_', varStr) 

>>> clean('32v2 g #Gmw845h$W b53wi ') 
'_32v2_g__Gmw845h_W_b53wi_' 

這種替換替換任何非可變適當的字符以下劃線和插入在前面強調如果字符串以數字開頭。 IMO,'name/with/slashes'看起來更好,因爲變量名稱name_with_slashesnamewithslashes更好。

+0

哇,我真的很感動 – 2014-03-19 21:55:09