2017-10-01 15 views
0

はここ findallやsearchを使ってpythonでデータを抽出するには?

str = 'A:[{type:"mb",id:9,name:"John",url:"/mb9/",cur:0,num:83498}, 
{type:"mb",id:92,name:"Mary",url:"/mb92/",cur:0,num:404}, 
{type:"mb",id:97,name:"Dan",url:"/mb97/",cur:0,num:139}, 
{type:"mb",id:268,name:"Jennifer",url:"/mb268/",cur:0,num:0}, 
{type:"mb",id:289,name:"Mike",url:"/mb289/",cur:0,num:0}],B: 
[{type:"mb",id:157,name:"Sue",url:"/mb157/",cur:0,num:35200}, 
{type:"mb",id:3,name:"Rob",url:"/mb3/",cur:0,num:103047}, 
{type:"mb",id:2,name:"Tracy",url:"/mb2/",cur:0,num:87946}, 
{type:"mb",id:26,name:"Jenny",url:"/mb26/",cur:0,num:74870}, 
{type:"mb",id:5,name:"Florence",url:"/mb5/",cur:0,num:37261}, 
{type:"mb",id:127,name:"Peter",url:"/mb127/",cur:0,num:63711}, 
{type:"mb",id:15,name:"Grace",url:"/mb15/",cur:0,num:63243}, 
{type:"mb",id:82,name:"Tony",url:"/mb82/",cur:0,num:6471}, 
{type:"mb",id:236,name:"Lisa",url:"/mb236/",cur:0,num:4883}]' 

私はfindAllの使用または「名前」とstrから「URL」の下にあるすべてのデータを抽出するために、検索したい、私の文字列です。ここで私は何をしたのですか?

pattern = re.comile(r'type:(.*),id:(.*),name:(.*),url:(.*),cur:(.*),num: 
(.*)') 

for (v1, v2, v3, v4, v5, v6) in re.findall(pattern, str): 
    print v3 
    print v4 

残念ながら、これは私がしたいことをしません。どうかしましたか?あなたの入力をありがとう。

+2

(1)コードが返すものを表示する必要があります。 (2)欲張り/非貪欲な正規表現の修飾子について読んでください。 –

+4

この文字列はどこから来たのですか? JSONのように見えます( '{}'の開閉は例外です)。もしそうなら、regexesの代わりに 'json'モジュールを使って解析してください。 – mkrieger1

+0

実際に貪欲でない正規表現修飾子を使用すると、最初の名前とurl、つまり 'John'と '/ mb9 /'だけが返されます。 greedy regex修飾子を使用すると、文字列全体が返されます。 –

答えて

0

を。しかし、あなたのためのオプションがあります:

# Find all of the entries 
x = re.findall('(?<![AB]:)(?<=:).*?(?=[,}])', s) 

['"mb"', '9', '"John"', '"/mb9/"', '0', '83498', '"mb"', '92', '"Mary"', 
'"/mb92/"', '0', '404', '"mb"', '97', '"Dan"', '"/mb97/"', '0', '139', 
'"mb"', '268', '"Jennifer"', '"/mb268/"', '0', '0', '"mb"', '289', '"Mike"', 
'"/mb289/"', '0', '0', '"mb"', '157', '"Sue"', '"/mb157/"', '0', '35200', 
'"mb"', '3', '"Rob"', '"/mb3/"', '0', '103047', '"mb"', '2', '"Tracy"', 
'"/mb2/"', '0', '87946', '"mb"', '26', '"Jenny"', '"/mb26/"', '0', '74870', 
'"mb"', '5', '"Florence"', '"/mb5/"', '0', '37261', '"mb"', '127', '"Peter"', 
'"/mb127/"', '0', '63711', '"mb"', '15', '"Grace"', '"/mb15/"', '0', '63243', 
'"mb"', '82', '"Tony"', '"/mb82/"', '0', '6471', '"mb"', '236', '"Lisa"', 
'"/mb236/"', '0', '4883'] 

# Break up into each section 
y = [] 
for i in range(0, len(x), 6): 
    y.append(x[i:i+6]) 

[['"mb"', '9', '"John"', '"/mb9/"', '0', '83498'] 
['"mb"', '92', '"Mary"', '"/mb92/"', '0', '404'] 
['"mb"', '97', '"Dan"', '"/mb97/"', '0', '139'] 
['"mb"', '268', '"Jennifer"', '"/mb268/"', '0', '0'] 
['"mb"', '289', '"Mike"', '"/mb289/"', '0', '0'] 
['"mb"', '157', '"Sue"', '"/mb157/"', '0', '35200'] 
['"mb"', '3', '"Rob"', '"/mb3/"', '0', '103047'] 
['"mb"', '2', '"Tracy"', '"/mb2/"', '0', '87946'] 
['"mb"', '26', '"Jenny"', '"/mb26/"', '0', '74870'] 
['"mb"', '5', '"Florence"', '"/mb5/"', '0', '37261'] 
['"mb"', '127', '"Peter"', '"/mb127/"', '0', '63711'] 
['"mb"', '15', '"Grace"', '"/mb15/"', '0', '63243'] 
['"mb"', '82', '"Tony"', '"/mb82/"', '0', '6471'] 
['"mb"', '236', '"Lisa"', '"/mb236/"', '0', '4883']] 

# Name is 3rd value in each list and url is 4th 
for i in y: 
    name = i[2] 
    url = i[3] 
+0

それはまた動作します!ありがとう。 –

0

あなたはこの試みることができます:それは組み込み関数だからあなたが "STR、" あなたの文字列を呼び出すべきではありません

import re 
data = """ 
A:[{type:"mb",id:9,name:"John",url:"/mb9/",cur:0,num:83498}, 
{type:"mb",id:92,name:"Mary",url:"/mb92/",cur:0,num:404}, 
{type:"mb",id:97,name:"Dan",url:"/mb97/",cur:0,num:139}, 
{type:"mb",id:268,name:"Jennifer",url:"/mb268/",cur:0,num:0}, 
{type:"mb",id:289,name:"Mike",url:"/mb289/",cur:0,num:0}],B: 
[{type:"mb",id:157,name:"Sue",url:"/mb157/",cur:0,num:35200}, 
{type:"mb",id:3,name:"Rob",url:"/mb3/",cur:0,num:103047}, 
{type:"mb",id:2,name:"Tracy",url:"/mb2/",cur:0,num:87946}, 
{type:"mb",id:26,name:"Jenny",url:"/mb26/",cur:0,num:74870}, 
{type:"mb",id:5,name:"Florence",url:"/mb5/",cur:0,num:37261}, 
{type:"mb",id:127,name:"Peter",url:"/mb127/",cur:0,num:63711}, 
{type:"mb",id:15,name:"Grace",url:"/mb15/",cur:0,num:63243}, 
{type:"mb",id:82,name:"Tony",url:"/mb82/",cur:0,num:6471}, 
{type:"mb",id:236,name:"Lisa",url:"/mb236/",cur:0,num:4883}] 
""" 
full_data = [i[1:-1] for i in re.findall('(?<=name:)".*?"(?=,)|(?<=url:)".*?"(?=,)', data)] 
final_data = [full_data[i]+":"+full_data[i+1] for i in range(0, len(full_data)-1, 2)] 
print(full_data) 

出力

['John:/mb9/', 'Mary:/mb92/', 'Dan:/mb97/', 'Jennifer:/mb268/', 'Mike:/mb289/', 'Sue:/mb157/', 'Rob:/mb3/', 'Tracy:/mb2/', 'Jenny:/mb26/', 'Florence:/mb5/', 'Peter:/mb127/', 'Grace:/mb15/', 'Tony:/mb82/', 'Lisa:/mb236/'] 
+0

あなたの返事をありがとう。名前とURLの両方からデータを抽出するためにfindallを使用できますか?名前とURLのデータを個別に抽出すると、個々の名前とURLがどのように関連しているかという情報が失われます。 –

+0

@JohnChen最近の私の編集をご覧ください。 – Ajax1234

+0

ご返信ありがとうございます。一つの質問があります。明らかに、選択したパターンにはnameとurlの両方が含まれていますが、返される値はまだnameかurlのどちらかですか? 1つの戻り値にnameとurlの両方が含まれていないのはなぜですか? –

関連する問題