2010-07-21 11 views
11

Ich muss eine beliebige Zeichenfolge in eine Zeichenfolge konvertieren, die in Python ein gültiger Variablenname ist.Wie konvertiere ich einen String in einen gültigen Variablennamen in Python?

Hier ist ein sehr einfaches Beispiel:

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 

, dass ein sehr naiven Ansatz ist. Ich muss überprüfen, ob die Zeichenfolge ungültige Variable Namen Zeichen enthält und sie durch '' ersetzen

Was wäre ein Pythonic Weg, dies zu tun?

+0

Welches Problem versuchen Sie mit dieser Methode zu lösen? Es könnte einen besseren Weg geben. – Daenyth

+2

'print repr (" eine Zeichenkette ")' zeigt die Zeichenkette in Anführungszeichen an - besser als _ _ 'daran anzufügen. –

+0

Ich durchquere ein Szenen-Diagramm von Cinema 4d und muss es im Mixer neu erstellen. Um die Dinge für mich verständlich zu halten, möchte ich die tatsächlichen Namen der cinema4d Objekte als Variablennamen für Blender Python verwenden, also muss ich diese zuerst anpassen –

Antwort

21

According to Python, ist eine Kennung, einen Brief oder unterstreichen, eine unbegrenzte Zeichenfolge aus Buchstaben, Zahlen gefolgt, und unterstreicht:

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 

Verwendung wie folgt aus:

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

+1 machen, um zu erkennen, dass gültige Zeichen für den ersten Buchstaben von den nachfolgenden Buchstaben abweichen und nur gültige Buchstaben zulassen oder ungültige Buchstaben entfernen. –

+1

Aber reservierte Wörter können nicht als Variablennamen verwendet werden ... –

+1

@JukkaSuomela hat einen tollen Punkt. Da alle reservierten Schlüsselwörter nur Buchstaben sind, können Sie garantieren, dass kein Konflikt entsteht, indem Sie einen Unterstrich hinzufügen (wenn Sie wirklich gut sein wollen, können Sie zuerst prüfen, ob der Name ein Schlüsselwort ist und nur einen Unterstrich hinzufügen, wenn das der ist) Fall). –

4

Sie sollten eine Regex erstellen, die eine Whitelist zulässiger Zeichen darstellt und alles ersetzen, was nicht in dieser Zeichenklasse enthalten ist.

+7

Oder noch besser, erstellen Sie eine Whitelist von zulässigen _strings_ und verknüpfen Sie sie mit tatsächlichen vordefinierten Objekten. Jedes Mal, wenn Fragen wie diese aufkommen, werde ich nervös und denke, dass jemand mit Sicherheit ein massives Sicherheitsloch schreiben wird. –

+0

:) nicht ich ... Ich analysiere gerade ein Szenengraph von Cinema 4d und muss es im Mixer erstellen. Animatoren müssen sich normalerweise keine Sorgen um Leerzeichen/Schrägstriche/etc in den Objektnamen –

1

Verwenden Sie das re-Modul und entfernen Sie alle ungültigen Zeichen.

30
Nun

, würde ich gerne zur besten Triptych-Lösung mit ... einem One-Liner!

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

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

Diese Substitution ersetzt jede nicht-variable entsprechende Zeichen mit Unterstrich und Einsätze vor unterstreichen, wenn die Zeichenfolge mit einer Ziffer beginnt. IMO, 'name/with/slashes' sieht besser aus als Variablenname name_with_slashes als namewithslashes.

+0

wow, ich bin wirklich beeindruckt –

Verwandte Themen