2010-07-21 4 views
11

J'ai besoin de convertir une chaîne arbitraire en une chaîne qui est un nom de variable valide dans python.comment convertir une chaîne en un nom de variable valide en python?

Voici un exemple très simple:

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 

C'est une approche très naïve. Je dois vérifier si la chaîne contient des caractères de nom de variable invalides et les remplacer par ''

Quelle serait une façon pythonique de le faire?

+0

Quel problème essayez-vous de résoudre en utilisant cette méthode? Il pourrait y avoir un meilleur moyen. – Daenyth

+2

'print repr (" une chaîne ")' affiche la chaîne entre guillemets - plus propre que d'y ajouter _ _'. –

+0

Je traverse un graphe de scène du cinéma 4d et j'ai besoin de le recréer dans blender. Pour garder les choses faciles à comprendre, je veux utiliser les noms réels des objets cinema4d comme noms de variables pour Blender Python, donc j'ai besoin d'ajuster ces premiers –

Répondre

21

According to Python, un identifiant est une lettre ou un trait de soulignement suivi d'une chaîne illimité de lettres, des chiffres, et souligne:

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 

Utilisez comme ceci:

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

+1 pour reconnaître que les caractères valides sont différents pour la première lettre et les lettres suivantes et pour autoriser uniquement les lettres valides et les lettres invalides. –

+1

Mais les mots réservés ne peuvent pas être utilisés comme noms de variables ... –

+1

@JukkaSuomela a un bon point. Puisque tous les mots-clés réservés ne sont que des lettres, vous pouvez garantir qu'il n'y aura pas de conflit en ajoutant un trait de soulignement (si vous voulez être vraiment bon, vous pouvez d'abord vérifier si le nom est un mot-clé Cas). –

4

Vous devez créer une regex qui est une liste blanche de caractères autorisés et remplacer tout ce qui n'est pas dans cette classe de caractères.

+7

Ou mieux encore, établissez une liste blanche des chaînes autorisées et reliez-les à des objets prédéfinis. Chaque fois que des questions de ce genre se présentent, je suis nerveux et je pense que quelqu'un est sur le point d'écrire un énorme trou de sécurité. –

+0

:) pas moi ... Je suis juste en train d'analyser un graphe de scène du cinéma 4d et j'ai besoin de le créer dans blender. Les animateurs ne s'inquiètent généralement pas ou ont besoin de s'inquiéter des espaces/slashes/etc dans les noms d'objets –

1

Utilisez le module re et supprimez tous les modèles invalides.

30

Eh bien, je aimez la meilleure solution de Triptych avec ... un one-liner!

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

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

Cette substitution remplace tout caractère approprié non variable avec underscore et inserts underscore avant si la chaîne commence par un chiffre. IMO, 'name/with/slashes' est mieux nommé name_with_slashes que namewithslashes.

+0

wow, je suis vraiment impressionné –

Questions connexes