2010-10-31 134 views
1

我有已被格式化这样字符串转换

myString = “[name = john, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24]” 

当然的字符串比这更长的长字符串对象。 我也有3名名单与相关名称:

Names = [] 
Families = [] 
Ages  = [] 

我想读通过字符字符串的字符,并采取数据并将其追加到适当的列表中。任何人都可以帮我关于如何将字符串分离为变量? 我需要的东西是这样的:

Names = [“john”, “jeff”, ...] 
Families = [“candy”, “Thomson”, ...] 
Ages = [72, 24, ...] 
+0

所以它是确定在某一时刻在内存中的整个字符串? – 2010-10-31 12:16:57

+0

是的,这没有问题, – user435245 2010-10-31 12:18:18

回答

5

这可以用一个正则表达式来完成。基本上,构造一个正则表达式,从字符串中提取姓名,家庭和年龄,并从tuple中提取相关数据,以便构建您的list

import re 

if __name__=='__main__': 
    myString = "[name = john adams, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24]" 
    answers=re.findall("\\[\\s*name = ([^,]+), family = (\\w+), age = (\\d+)\\]",myString) 
    names=[x[0] for x in answers] 
    families=[x[1] for x in answers] 
    ages=map(int,(x[2] for x in answers)) 

    print "names: ",names 
    print "families: ", families 
    print "ages: ", ages 
+0

+1 - 真的很不错。 – duffymo 2010-10-31 12:33:13

+0

感谢您的回答,但如果名称之间有空格,例如name =“Antoni Red” – user435245 2010-10-31 13:35:23

+0

@ user435245:更新我的正则表达式以允许除','以外的所有字符。我仍然假设家庭不会包含空格,但您也可以通过为家庭使用相同的正则表达式来更改该空格。 – MAK 2010-11-01 05:27:28

1

问题分解下来:

  1. 解析字符串转换成列表
  2. 加载列表到你的其他名单。

您将遇到问题,因为逗号之间的实体不是很好的字典。

3
import re 

Names = [] 
Families = [] 
Ages  = [] 
myString = "[name = john, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24" 

myregex = re.compile("name = (?P<name>.*?), family = (?P<family>.*?), age = (?P<age>.*)") 

for list_ in myString.split(']'): 
    found = re.search(myregex, list_).groupdict() 
    Names.append(found['name']) 
    Families.append(found['family']) 
    Ages.append(int(found['age'])) 
+0

+1用于使用命名组,而不是依赖数据的格式不更改。在一个一次性的脚本中,也许看起来并不值得这么麻烦,但似乎我花了很多时间来维护应该是一次性脚本的东西。 – bgporter 2010-10-31 12:53:14

1

你应该解析到一个字典列表,而不是三个differente名单,只能通过数据的顺序联合有关。 像data = [ {"name": "John", "family": "Candy", "age": 72 }, ...]

一种可能性,如果你不能改变的数据源,是做字符串的方法,如分裂有些幼稚解析:

myString = "[name = john, family = candy, age = 72],[ name = jeff, family = Thomson, age = 24]" 

data = [] 
for block in myString.split("]"): 
    if not block: break 
    block = block.split("[")[1] 
    entry_dict = {} 
    for part in block.split(","): 
     key, value = part.split("=") 
     key = key.strip() 
     value = value.strip() 
     if key == "age": value = int(value) 
     entry_dict[key] = value 
    data.append (entry_dict) 

或者,如果你是在Python 2.7版(或3.1),并希望有一个更短的代码,你可以使用的字典生成 (您可以使用其他版本的发电机,以及,刚刚创建的元组ALIST并增加了“字典”调用):

的myString =“[名称=约翰,家庭=糖果,年龄= 72],[姓氏=杰夫,家庭=汤姆森,年龄= 24]“

data = [] 
for block in myString.split("]"): 
    if not block: break 
    block = block.split("[")[1] 
    entry_dict = {} 
    data.append ({(part.split("=")[0].strip(), part.split("=")[1].strip()) for part in block.split(",") }) 

(在这个版本中没有“年龄”转换为数字,虽然)