2012-08-25 9 views
3

J'ai actuellement le code suivant, qui trouve des lettres majuscules dans une chaîne « formule »: http://pastebin.com/syRQnqCPdécoupant une chaîne en lettres majuscules

Maintenant, ma question est, comment puis-je modifier ce code (Ne tenez pas le bit dans le "if choice = 1:" loop) de sorte que chaque partie de cette nouvelle chaîne est mise dans sa propre variable? Par exemple, mettre du NaBr résulterait en la rupture de la chaîne en "Na" et "Br". J'ai besoin de les mettre dans des variables séparées afin que je puisse les rechercher dans mon fichier CSV. De préférence, ce serait une sorte de chose générée, donc s'il y a 3 éléments, comme MgSO4, O serait placé dans une variable séparée comme le serait Mg et S. Si ce n'est pas clair, faites le moi savoir et je vais essayer de le rendre un peu plus compréhensible ... Aucune façon de le faire vient à l'esprit pour le moment, cependant. :(

EDIT: pièces pertinentes du code:

Fonction:

def split_uppercase(string): 
x='' 
for i in string: 
    if i.isupper(): x+=' %s' %i 
    else: x+=i 
return x.strip() 

entrée de chaîne et recherche:

formula = raw_input("Enter formula: ") 
upper = split_uppercase(formula) 

#Pull in data from form.csv 
weight1 = float(formul_data.get(element1.lower())) 
weight2 = float(formul_data.get(element2.lower())) 
weight3 = float(formul_data.get(element3.lower())) 


weightSum = weight1 + weight2 + weight3 
print "Total weight =", weightSum 
+0

Pourriez-vous poster les parties * pertinentes * de votre code ici? – Levon

+0

Désolé, nous avons pensé qu'il serait préférable d'avoir le code complet afin qu'il y ait moins de confusion quant aux différentes choses utilisées. Pièces pertinentes maintenant dans le post. – dantdj

+1

Merci .. cela rend les choses plus faciles (et vous pouvez être sûr, les gens * demanderont * plus de code s'ils en ont besoin :) – Levon

Répondre

18

Je pense qu'il ya un moyen de faire beaucoup plus facile ce que vous Essayez d'utiliser des expressions régulières, par exemple:

>>> [a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a] 
['Mg', u'S', u'O', u'4'] 

Si vous voulez que le numéro attaché à l'élément à droite, il suffit d'ajouter un spécificateur de chiffres dans la regex:

>>> [a for a in re.split(r'([A-Z][a-z]*\d*)', txt) if a] 
[u'Mg', u'S', u'O4'] 

Vous ne voulez pas vraiment de « mettre chaque partie dans sa propre variable ». Cela n'a pas de sens en général, parce que vous ne savez pas combien de parties il y a, donc vous ne pouvez pas savoir combien de variables créer à l'avance. Au lieu de cela, vous voulez faire une liste, comme dans l'exemple ci-dessus. Ensuite, vous pouvez itérer sur cette liste et faire ce que vous devez faire avec chaque pièce.

+0

+1 pour utiliser 're.split()' (j'allais juste suggère que) et pour l'avis d'utiliser une liste pour stocker les résultats au lieu de traiter avec un nombre inconnu de variables – Levon

+0

La seule raison pour laquelle je les voulais dans différentes variables était pour la recherche, parce que je vais finir par trouver des poids et les ajouter ensemble, un peu comme dans la partie sous "if choice = 1:" dans le code complet sur pastebin. Je vais regarder dans ce que vous avez décrit, cependant, acclamations. Note rapide, cela va provenir d'un raw_input, donc je ne sais pas comment remplacer MgSO4 dans votre code par ce qui vient de l'entrée dans raw_input. – dantdj

+0

@dantdj: mais regardez votre code d'ajout de poids. Vous avez trois lignes qui ne diffèrent que par les noms. Si vous utilisez une liste, vous pouvez simplement écrire: weight_sum = sum (float (formula_data.get (elem.lower())) pour elem in elements), etc., et vous pourrez alors gérer n'importe quel nombre d'éléments. [Avec un tweak pour gérer les chiffres, bien sûr.] – DSM

9

Vous pouvez utiliser re.split pour effectuer un fractionnement complexe sur les chaînes.

import re 

def split_upper(s): 
    return filter(None, re.split("([A-Z][^A-Z]*)", s)) 

>>> split_upper("fooBarBaz") 
['foo', 'Bar', 'Baz'] 
>>> split_upper("fooBarBazBB") 
['foo', 'Bar', 'Baz', 'B', 'B'] 
>>> split_upper("fooBarBazBB4") 
['foo', 'Bar', 'Baz', 'B', 'B4'] 
Questions connexes