2010-07-21 11 views
11

Ho bisogno di convertire una stringa arbitraria in una stringa che è un nome di variabile valido in python.come posso convertire una stringa in un nome di variabile valido in python?

Ecco un esempio molto semplice:

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 

Questo è un approccio molto ingenuo. Devo controllare se la stringa contiene caratteri di nome variabile non validi e sostituirli con ''

Quale sarebbe un modo pitone per farlo?

+0

Quale problema stai cercando di risolvere utilizzando questo metodo? Potrebbe esserci un modo migliore. – Daenyth

+2

'print repr (" a string ")' mostra la stringa tra virgolette - più netta di appendere '_' ad essa. –

+0

Sto attraversando un grafico di scena dal cinema 4d e ho bisogno di ricrearlo nel frullatore. Per semplificare la comprensione, desidero utilizzare i nomi effettivi degli oggetti cinema4d come nomi di variabili per Blender Python, quindi è necessario regolare i primi –

risposta

21

According to Python, un identificatore è una lettera o di sottolineatura, seguito da una stringa illimitata di lettere, numeri, e sottolinea:

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 

Usa come questo:

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

+1 per riconoscere che i caratteri validi sono diversi per la prima lettera rispetto alle lettere successive e consentono solo lettere valide rispetto alla rimozione di lettere non valide. –

+1

Ma le parole riservate non possono essere usate come nomi di variabili ... –

+1

@JukkaSuomela ha un ottimo punto. Dal momento che tutte le parole chiave riservate sono solo lettere, puoi garantire che non ci sarà conflitto aggiungendo un carattere di sottolineatura (se vuoi essere veramente buono, puoi prima controllare se il nome è una parola chiave e aggiungere un trattino basso solo se questo è il Astuccio). –

4

Si dovrebbe creare un'espressione regolare che è una lista bianca di caratteri consentiti e sostituire tutto ciò che non è in quella classe di caratteri.

+7

O meglio ancora, crea una whitelist di _strings_ consentite e collegale a oggetti predefiniti reali. Ogni volta che arrivano domande come questa, mi innervosisco e penso che qualcuno stia quasi certamente per scrivere un enorme buco nella sicurezza. –

+0

:) non io ... Sto solo analizzando un grafico di scena del cinema 4d e ho bisogno di ricrearlo nel frullatore. Gli animatori di solito non si preoccupano o hanno bisogno di preoccuparsi di spazi/barre/ecc nei nomi degli oggetti –

1

Utilizzare il modulo re e rimuovere tutti i caratteri non validi.

30

Beh, mi piacerebbe mi piace la migliore soluzione di Triptych con ... una sola linea!

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

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

Questa sostituzione sostituisce qualsiasi carattere appropriato non variabile con sottolineatura e inserti sottolineatura davanti se la stringa inizia con una cifra. IMO, 'nome/con/barre' appare meglio come nome variabile name_with_slashes rispetto a namewithslashes.

+0

wow Sono sinceramente impressionato –

Problemi correlati