2010-08-20 6 views
0

Je suis nouveau sur Python. Y a-t-il un StringTokenizer en Python? Est-ce que je peux faire des caractères par balayage et copie de caractères.Python: Comment extraire les informations requises d'une chaîne?

J'ai la chaîne d'entrée suivante

data = '123:Palo Alto, CA -> 456:Seattle, WA 789' 

je dois extraire les deux (ville, état) les champs de cette chaîne. Voici le code que j'ai écrit

name_list = [] 
while i < len(data)): 
     if line[i] == ':': 
      name = '' 
      j = 0 
      i = i + 1 
      while line[i] != '-' and line[i].isnumeric() == False: 
      name[j] = line[i] # This line gives error 
      i = i + 1 
      j = j + 1 
      name_list.append(name) 
     i = i + 1 

Que dois-je faire?

+0

-ce que toutes les villes entre un: et un, et ces publications n'apparaissent nulle part ailleurs? – Mark

+0

@Mark: J'ai changé la question. J'ai besoin des champs (ville, état) maintenant. Oui, ces ponctuations n'apparaissent nulle part ailleurs – Bruce

+0

Est-ce que c'est 789 à la fin une faute de frappe, ou le motif est-il non répétitif? – sdolan

Répondre

3

Mon point de vue, en supposant que la chaîne est toujours formaté selon votre exemple:

import re 

data = '123:Palo Alto, CA -> 456:Seattle, WA 789' 

name_list = [] 
r = re.compile("(\s?\d)|:") 
name_list += r.sub("", data).split(" ->") 
print name_list # Prints ['Palo Alto, CA', 'Seattle, WA'] 

Comme une note sur votre erreur, la chaîne vide aura une longueur de 0, donc l'index 0 n'existe pas:

>>> s = "" 
>>> len(s) 
0 

Vous pouvez cependant concaténer les chaînes en Python avec l'opérateur +, comme ceci:

>>> s += "Some" 
>>> s += " Text" 
>>> print s 
Some Text 
1

en supposant que vous avez toujours la chaîne formatés comme indiqué, vous pouvez faire:

cityState = [] 
for line in data.split('->'): 
    cityState.append({'city':city=line.strip().split(',')[0].split(':')[1], 
        'state':state=line.strip().split(',').split(' ')[1]}) 
1

Vous pouvez toujours utiliser une expression régulière, si vous vouliez: /\d+:(\w+),\s(\w+)/. Ce n'est pas joli, mais il devrait faire le travail. En supposant que la chaîne à correspondre est la chaîne de test que vous aviez.

import re 

for s in string_to_match.split("->"): 
    m = re.match(r"\d+:(\w+),\s(\w+)", s) 
    city = m.group(1) 
    state = m.group(2) 

La syntaxe peut être un peu éteinte, mais l'idée générale est là.

1

Vous pouvez utiliser regex. Voici mon regex laid, vous pouvez faire mieux

inputStr = '123:Palo Alto, CA -> 456:Seattle, WA 789'; 
m = re.search('.*:(.*),(.*)->.*:(.*),\s*(\S{2})', inputStr) 
print "City1=" + m.group(1) 
print "State1=" + m.group(2) 
print "City2=" + m.group(3) 
print "State2=" + m.group(4) 

Produit

City1=Palo Alto 
State1= CA 
City2=Seattle 
State2=WA 
6
data = '123:Palo Alto, CA -> 456:Seattle, WA 789' 
citys = [] 
for record in data.split("->"): 
    citys.append(
     re.search(r":(?P<city>[\w\s]+),\s*(?P<state>[\w]+)",record) 
     .groupdict() 
    ) 

print citys 

donne:

[{'city': 'Palo Alto', 'state': 'CA'}, {'city': 'Seattle', 'state': 'WA'}]

Questions connexes