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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1298閲覧

リストの入れ子構造を直したい。

konataro

総合スコア37

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/25 13:51

編集2019/04/25 14:25

re.findall()を使いある文字列から正規表現で数字を抽出したのですが、コード内にあるようなグループを二つ使った正規表現だと実行結果aのような入れ子構造リストになってしまいます。

これを一番下にあるリストの形にするにはどうしたらいいでしょうか。
どなたか解決方法をお願い致します。

Python

1import re 2 3 4strings = """和 123.456789 + 987.654321 = 1111.111110 5差 123.456789 - 987.654321 = -864.197532 6積 123.456789 * 987.654321 = 121932.631113 7商 123.456789 / 987.654321 = 0.125000""" 8O =[i for i in range(4)] 9 10 11def extract(string): 12 extract_value = re.findall(r"(-?\d+.?\d*)\n|(-?\d+.?\d*)$", string) 13 return extract_value 14 15 16def eval_number(a, b): 17 print(a) 18 print(b) 19 print("len(a):%d, len(b):%d"% (len(a),len(b))) 20 return len(a) == len(b) 21 22if eval_number(extract_out(strings),O): 23 print("eval_number is true") 24

実行結果

[('1111.111110', ''), ('-864.197532', ''), ('121932.631113', ''), ('', '0.125000')] [0, 1, 2, 3] len(a):4, len(b):4 eval_number is true

aを下のようなリストにしたい。または、この形のリストで抽出したい。

a

1[1111.111110,-864.197532,121932.631113,0.1250000]

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

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

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

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

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

LouiS0616

2019/04/25 14:09 編集

状態が再現するような元々の文字列および抽出コードをご提示していただけると、根本的な解決法がアドバイスできるかもしれません。
konataro

2019/04/25 14:26

文字列と抽出のコードを記載しました。よろしくお願いいたします。
guest

回答2

0

ベストアンサー

re.MULTILINEフラグを立てれば、$は行末にもマッチします。

Python

1import re 2 3strings = """和 123.456789 + 987.654321 = 1111.111110 4差 123.456789 - 987.654321 = -864.197532 5積 123.456789 * 987.654321 = 121932.631113 6商 123.456789 / 987.654321 = 0.125000""" 7 8def extract(string): 9 extract_value = re.findall(r"-?\d+.?\d*$", string, flags=re.MULTILINE) 10 return extract_value 11 12print(extract(strings))

実行結果 Wandbox

['1111.111110', '-864.197532', '121932.631113', '0.125000']

おまけ

あくまでリスト処理に依って問題を解決するなら。


test_list_1 = [(10,100),100,200,300]

下のようなリストにしたい
test_list_2 = [10,100,100,200,300]

いわゆるflatten処理ですね。
再帰を利用して書くと見通しが付きやすいことが知られています。

Python

1def _flatten(src): 2 if isinstance(src, str): 3 yield src 4 elif hasattr(src, '__iter__'): 5 for block in src: 6 yield from _flatten(block) 7 else: 8 yield src 9 10def flatten(src): 11 return list(_flatten(src)) 12 13src = [(10, 100), 100, 200, 300] 14dst = flatten(src) 15 16print(dst)

実行結果 Wandbox

[10, 100, 100, 200, 300]

[('1111.111110', ''), ('-864.197532', ''), ('121932.631113', ''), ('', '0.125000')]

下のようなリストにしたい。または、この形のリストで抽出したい。
[1111.111110,-864.197532,121932.631113,0.1250000]

リスト内の全ての要素について、空でない文字列を選択したいケースですね。
こんなふうに書けそうです。

Python

1src = [('1111.111110', ''), ('-864.197532', ''), ('121932.631113', ''), ('', '0.125000')] 2dst = [float(l or r) for l, r in src] 3 4print(dst)

実行結果 Wandbox

[1111.11111, -864.197532, 121932.631113, 0.125]

Pythonのor演算子の独特な仕様を存分に活用できます。

投稿2019/04/25 14:30

編集2019/04/25 17:18
LouiS0616

総合スコア35660

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

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

konataro

2019/04/25 14:39

回答ありがとうございます。 グループ化はいらなかったのですね・・・勉強になりましたm(_ _)m
LouiS0616

2019/04/25 17:07 編集

グループ化しても良いですが、後方参照が無い場合は (?:正規表現) を利用してキャプチャを取らない方がトラブルが少ないでしょう。 re.findall(r"(?:-?\d+.?\d*)(?=\n)|(?:-?\d+.?\d*)$", string) みたいな感じで。 ...まぁ、選言の優先順位は最も低いので、単に -?\d+.?\d*(?=\n)|-?\d+.?\d*$ で充分なんですけどね。
guest

0

根本的な解決ではないですが

python3

1 2test_list_1=[(10,100),100,200,300]] 3test_list_2=[*num[0]]+[num[1],num[2],num[3]] 4

でいけると思います。

投稿2019/04/25 14:26

Naru123

総合スコア19

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

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

konataro

2019/04/25 14:28

*num[0]←このアスタリスクはどういった意味なのでしょうか。 教えていただけると助かります。
LouiS0616

2019/04/25 14:34

@Naru123 さん その方法なら [*num[0], *num[1:]] の方がより柔軟な気がします。
Naru123

2019/04/25 14:36

python3から実装されたアスタリスクによるアンパックというものです 変数の数<要素の数の時に*を付けた部分がリストやタプルの拡張、分解ということが起きます
Naru123

2019/04/25 14:38

@LouiS0616 さん ご指摘ありがとうございます、確かにスライスを使うべきですね。見落としていました
konataro

2019/04/25 14:42

webも調べながらで理解できました。 ありがとうございます。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問