2010-10-31 172 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(",") }) 

(在這個版本中沒有「年齡」轉換爲數字,雖然)