2010-01-16 6 views
18

Je souhaite extraire des informations d'un texte saisi par l'utilisateur. Imaginez que je saisis ce qui suit:Extraire une chaîne entre guillemets

SetVariables "a" "b" "c" 

Comment extraire des informations entre le premier ensemble de citations? Alors la seconde? Alors le troisième?

Répondre

26
>>> import re 
>>> re.findall('"([^"]*)"', 'SetVariables "a" "b" "c" ') 
['a', 'b', 'c'] 
+0

Le point-virgule à la fin de la ligne est-il nécessaire? – User

+0

@jspcal Cela fonctionne aussi pour les guillemets simples? –

9

Regular expressions sont bons à ceci:

import re 
quoted = re.compile('"[^"]*"') 
for value in quoted.findall(userInputtedText): 
    print value 
20

Vous pouvez faire un string.split() sur elle. Si la chaîne est mise en forme correctement avec les guillemets (c'est-à-dire le nombre pair de guillemets), chaque valeur impaire dans la liste contiendra un élément entre guillemets.

>>> s = 'SetVariables "a" "b" "c"'; 
>>> l = s.split('"')[1::2]; # the [1::2] is a slicing which extracts odd values 
>>> print l; 
['a', 'b', 'c'] 
>>> print l[2]; # to show you how to extract individual items from output 
c 

Ceci est également une approche plus rapide que les expressions régulières. Avec le module timeit, la vitesse de ce code est environ 4 fois plus rapide:

% python timeit.py -s 'import re' 're.findall("\"([^\"]*)\"", "SetVariables \"a\" \"b\" \"c\" ")' 
1000000 loops, best of 3: 2.37 usec per loop 

% python timeit.py '"SetVariables \"a\" \"b\" \"c\"".split("\"")[1::2];' 
1000000 loops, best of 3: 0.569 usec per loop 
Questions connexes