2014-05-20 41 views
0

這裏是我的問題: 考慮str的形式[{val1:false, test2:0.1}, {val2:false, test2:0.2}, {val3:false, test2:0.1}, ....] 我想在str列表中提取「{}」中包含的部分。提取包含在2 str之間的str

我想:

re.findall(re.escape("{")+"(.*)"+re.escape("}"), "chosen str") 

但是這似乎是工作,只有當一個occurence「{」 + ... +「}」出現含義這只是返回的清單1本案中就像輸入的形式一樣,[{擺脫了雙方。 要清楚我只是想輸入建議的形式收集在形式列表[["val1:false, test2:0.1"], [...]....]

任何方式來獲得pythonic的方式嗎?

+0

我覺得'{(。+?)}'會做。 – georg

+0

你想要列表中的每個字符串列表?你是不是想要獲得[「val1:false,test2:0.1」,「v2:1,v3:2」,...]? – daouzli

+0

如果你不需要正則表達式,你可以使用我的答案 – daouzli

回答

1

通過使用.*?使.*圖案變得不真實。

例如,

In [44]: s 
Out[44]: '{foo} {bar} {baz}' 

這裏的 「貪婪」 的比賽:

In [45]: re.findall(re.escape("{")+"(.*)"+re.escape("}"), s) 
Out[45]: ['foo} {bar} {baz'] 

現在的 「nongreedy」 匹配。注意補充?

In [46]: re.findall(re.escape("{")+"(.*?)"+re.escape("}"), s) 
Out[46]: ['foo', 'bar', 'baz'] 

約貪婪和nongreedy匹配之間的區別更多的信息,請參閱https://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy

+0

似乎「貪婪」匹配正是我所需要的感謝 – Demetrius

+0

意味着「非貪婪」一個抱歉 – Demetrius

0

這是不優雅,但如果你一定有一個字符串,完全按照自己的表現,你可以這樣做:

s = "[{val1:false, test2:0.1}, {val2:false, test2:0.2}, {val3:false, test2:0.1}]" 
s = s[1:-1] # remove leading "[" and ending "]" 
l = [d + "}" for d in s.split("}, ")] 
print l 

以前將產生:

['{val1:false, test2:0.1}', '{val2:false, test2:0.2}', '{val3:false, test2:0.1}}'] 

如果你喜歡的清單用字符串列表(如你的問題所述),使用:

l = [[d + "}"] for d in s.split("}, ")] 

它會生成:

[['{val1:false, test2:0.1}'], ['{val2:false, test2:0.2}'], ['{val3:false, test2:0.1}}']] 
+0

我正在計劃實施像你的完整代碼,除非我有直接的功能。無論如何謝謝你的幫助 – Demetrius

相關問題