質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

511閲覧

Python:文字列型[]で囲まれた中の値を抽出

ttoo

総合スコア126

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/05/15 03:24

編集2020/05/15 04:51

python3.8

a = "[{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}]"

上記変数aの値のANDの値や、value,[12345678]の値を抽出したいと考えておりますが、
どのようにして抽出すればよろしいでしょうか?
(質問の経緯といたしましては、AWS Lambdaにて、データを抽出する際に、
上記の変数の値のようなものを抽出しなければならないといった形になります)

json.loadsやjson.dumpsなど試してみましたが、初めと最後の[]に囲まれた部分により、
抽出がよりわからず困っております。

ご回答のほどよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2020/05/15 04:25 編集

失礼、カッコの数は間違っていませんでした。
quickquip

2020/05/15 04:47

質問タイトルが完全に誤ってますよね。(aは文字列型)
guest

回答3

0

ベストアンサー

execは、危険なことが分からないなら使っては駄目。


Pythonのリテラルとして正しい文字列を評価したいならast.literal_evalを使うべき。

pyhton

1import ast 2a = ast.literal_eval("[{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}]") 3print(type(a)) 4print(a)

結果

plain

1<class 'list'> 2[{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}]

これでPythonのデータ構造になるので取り出せます。(すでに回答は出ているので書きません)


ただ、なんでそんなことをやる羽目になっているのか? から考え直すべきです。


追記

例えば 'test''AND'のクォートが'であることが、今困っている主な理由なわけです。

もし仮にデータを出力する方もPythonで書かれていて、

python

1a = [{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}] 2print(a)

みたいなコードで出力しているなら、そちらがよくなくて、

python

1import json 2a = [{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}] 3print(json.dumps(a))

などに改めて[{"test": "AND", "children": [{"test3": "value", "test2": [12345678]}]}]と出力する方向性で直した方がずっといいですよね。(そうすれば色んな言語のJSONパーザで扱えます)

"なんでそんなことをやる羽目になっているのか?"というのはそんな話です。

投稿2020/05/15 04:46

編集2020/05/15 05:11
quickquip

総合スコア11074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttoo

2020/05/15 04:52

経緯を記載いたしました
guest

0

JSONのような文字列の中でシングルクオーテーションが使われているため、JSONとしてパースできないのが問題化と思われます。以下のようにシングルクオーテーション'をダブルクオーテーション"に置換してあげればjson.loadsが通ります。

Python

1a = "[{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}]" 2b = a.replace("'", '"') # 3d = json.loads(b) 4print(b[0][test]) 5...

投稿2020/05/15 04:30

編集2020/05/15 04:57
tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttoo

2020/05/15 04:35

Expecting property name enclosed in double quotes: line 1 column 3 (char 2) 上記の通り実行するとエラーが出力されました。
tachikoma

2020/05/15 04:57

失礼しました、replace文のところを間違っていました。
guest

0

listの中にあるものは[]の中にindex(整数)を、
dictの中にあるもの[]の中にkey(文字列)を入れて
というのを繰り返せば取れます。

python

1a = [{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}] 2print(a[0]['test']) 3# AND 4print(a[0]['children'][0]['test3']) 5# value 6print(a[0]['children'][0]['test2'][0]) 7# 12345678

python

1a = "[{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}]" 2exec("a="+a) 3print(a) 4# [{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}] 5print(a[0]['test']) 6# AND 7print(a[0]['children'][0]['test3']) 8# value 9print(a[0]['children'][0]['test2'][0]) 10# 12345678

投稿2020/05/15 03:43

編集2020/05/15 04:13
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttoo

2020/05/15 03:53

申し訳ございません。下記の場合で教えていただきたいです(´;ω;`)。 "[{'test': 'AND', 'children': [{'test3': 'value', 'test2': [12345678]}]}]" 質問内容の方も修正いたしました。
jeanbiego

2020/05/15 04:15

引用符に囲まれている場合を追記しました。 でも、これは面倒な方法なので文字列として読み込むより辞書型で読んだほうが良いと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問