#やりたいこと
- Python 3.9.5
ここにひとつの文字列があります
python
1'{q:2,num:20,title:"バラバラフィスティバル!",width:596,height:686,xalign:10,yalign:10,stage:[[2,1,2,7],[3,2,1,3,2],[6,3,3,3,1],[4,1,1,2,5],[1,2,1,3,2,5],[2,1,1,2,3,3,1],[2,2,1,1,2,1],[1,3,1,1,1],[2,1,4,1,1],[2,1,4,1,1],[1,2,4,1,1],[4,1,1,1],[2,2,1,1,2,1],[1,1,2,2,3,3,1],[3,1,3,2,5],[5,1,1,2,5],[6,3,2,5],[6,2,4,3,1],[3,1,1,4,2],[2,2,8],[1,2,4,2,3],[2,2,2,2,4],[3,2,2,5],[5,5,5],[4,2,3,5],[3,3,3,3,4],[3],[7,3,7],[2,2,5,2,2],[3,1,1,3,2],[2,1,1,1,1],[1,4,6],[5,7],[3,3],[2,3,4,2],[1,5,6,1],[1,16,1],[1,3,4,1],[2,14,2],[3,3]],chk:0}'
「:」を対にして辞書のような形式に見えますが、Pythonで辞書として扱うにはkeyの部分を
ダブルクォーテーションで囲ってあげる必要があります。
ライブラリreのfindallと正規表現を使って、「,」と「:」の間にある何文字かをリストとして
取り出してあげて、ダブルクォーテーションを付けた後にまた元に戻してあげられないかを考えています。
つまりはこういうことですね
Python
1import re 2 3text = "辞書っぽいひとつの文字列" 4 5key_list = re.findall(r",(.*?):", text)
r",(.*?):" について簡単に説明すると
「,」と「:」の間にある何文字かを指定しています。
一番最初の「,」から一番最後の「:」まで全部含まれてしまわないよう「?」つき
さて、このkey_listを主力してみましょう。
Python
1# 見やすいようにfor文 2for key in key_list: 3 print(key)
result
1num 2title 3width 4height 5xalign 6yalign 7stage 81,2,7],[3,2,1,3,2],[6,3,3,3,1],[4,1,1,2,5],[1,2,1,3,2,5],[2,1,1,2,3,3,1],[2,2,1,1,2,1],[1,3,1,1,1],[2,1,4,1,1],[2,1,4,1,1],[1,2,4,1,1],[4,1,1,1],[2,2,1,1,2,1],[1,1,2,2,3,3,1],[3,1,3,2,5],[5,1,1,2,5],[6,3,2,5],[6,2,4,3,1],[3,1,1,4,2],[2,2,8],[1,2,4,2,3],[2,2,2,2,4],[3,2,2,5],[5,5,5],[4,2,3,5],[3,3,3,3,4],[3],[7,3,7],[2,2,5,2,2],[3,1,1,3,2],[2,1,1,1,1],[1,4,6],[5,7],[3,3],[2,3,4,2],[1,5,6,1],[1,16,1],[1,3,4,1],[2,14,2],[3,3]],chk
最後が惜しいです。数字のリストの中にも「,」が使われているのでそちらを先に拾ってしまいました。
また、一つ目のkey「q」の前には「,」がないので取りこぼしてしまいました。
##その他に試したこと
そのほかにもこのような正規表現も試しました。
Python
1import re 2 3text = "辞書っぽいひとつの文字列" 4 5# 取りこぼし回避に意図的に","を先頭に付与して上書き、あとでまた消す? 6text = text.replace("{", "{,") 7 8key_list = re.findall(r",(\D+):", text)
今度は「,」と「:」の間にある数字以外の文字列(\D+)を指定してみました。
結果は
result
1q 2num 3title:"バラバラフィスティバル!",width 4height 5xalign 6yalign 7stage 8chk
少し希望の出力に近づきましたが、今度はtitle直後の「:」が認識されず
クオーテーションなどをエスケープしましたが変化なしでした。
##教えてほしいこと
未熟な私の考えつく限りは尽くしました。
ここで希望する出力さえ出せればあとは冒頭の説明通りクオーテーションを付けて
元に戻し、evalを使用して実際に辞書として使っていきたいと思います。
質問内容としては、「うまく取り出す方法や改善点をご教示ください」です。
その他、根本的な着眼点のミスや解決方法もお受付しております。
拙い説明ですが、どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー