2014-04-22 5 views
2

J'ai une liste telle quedécoupant une chaîne Python dans une liste

a=['john(is,great),paul,school','robert,jack,john'] 

alors je construis une liste vide pour ajouter la division

b=[] 

alors je fais

for i in a: 
    b.append(i.split(',')) 

mais la liste be apparaît comme ceci

[['john(is', 'great)', 'paul', 'school'], ['robert', 'jack', 'john']] 

Son faisant cela parce que sa division à la virgule, mais est-il une autre façon de diviser ce donc ce john(is', 'great) apparaît comme une chaîne comme john(is,great)

+0

Vous avez ** deux questions ** ici; S'il vous plaît gardez le à un problème à la fois s'il vous plaît. –

Répondre

6

Vous pouvez utiliser list.extend() pour ajouter des éléments individuellement:

for i in a: 
    b.extend(i.split(',')) 

Pour diviser le texte sur les virgules ne pas entre parenthèses vous pouvez utiliser l'expression régulière suivante:

re.split(r',(?=[^()]*(?:\(|$))', i) 

Ceci se divise sur une virgule seulement si elle n'est pas suivie d'un texte contenant des parenthèses (ouverture ou fermeture) jusqu'à la prochaine parenthèse ouvrante. Cette expression tombe lorsque vous avez imbriqué entre parenthèses, mais fonctionne pour votre cas simple:

>>> import re 
>>> i = 'john(is,great),paul,school' 
>>> re.split(r',+(?=[^()]*(?:\(|$))', i) 
['john(is,great)', 'paul', 'school'] 

Pour scissions plus complexes, utilisez un analyseur complet.

+0

oui mais c'est toujours le diviser à la virgule donc le premier élément est dans la liste qui est john (est, grand) retourne comme 2 chaînes et non 1 chaîne – user3527972

+0

@ user3527972: Comme je l'ai dit, vous avez 2 questions distinctes. :-) –

1

Si vous ne l'aimez pas des expressions régulières, vous pouvez également créer une procédure:

def splitter(s): 
    """Splits a string s on commas, but only if the comma 
    is not surrounded by parentheses.""" 
    if '(' in s and ')' in s: 
     start = s.find('(') 
     end = s.find(')') 
     new = s[start:end].replace(",", "@#$") 
     s = s[:start] + new + s[end:] 
     return [x.replace("@#$", ",") for x in s.split(",")] 
    return s.split(',') 

example = ['john(is,great),paul,school','robert,jack,john'] 

result = list() 

for i in example: 
    result.append(splitter(i)) 

print result 
# [['john(is,great)', 'paul', 'school'], ['robert', 'jack', 'john']]