ID非公開さん
2022/6/28 5:17
2回答
pythonでtxtファイルから数字を抽出し、その数字の合計を出力するプログラムを教えてください。 条件 a: x→y万のyの数字を最終的に足し合わせる
pythonでtxtファイルから数字を抽出し、その数字の合計を出力するプログラムを教えてください。 条件 a: x→y万のyの数字を最終的に足し合わせる a: x→y万この形のy以外の数字は全て無視(xは1文字以上) 必ずa:が価格と取り消し行為、b:が完了行為の組み合わせ yは10~100まで。10刻み。 6行目a: a→30万のように一行にaが2回出てきたらその行の価格は無視する 9行目a: →今のは取り消し!!!!のような取り消し行為はその前に出た価格を無視する(ここでは7行目のa: f→50万の50を無視) a,b,c等の記号は実際の文字数等は変化する(固定ではない) test.txt------------------------------------------------------- 28-06-2022 g: 価格 a: c→100万 b: c 完了! a: a→30万 a: f→40万 b: 10万 a: →今のは取り消し!!!! a: d→50万 a: →90万 a: あいう80万 b: d 完了! test.txtここまで------------------------------------------------ 今回の期待する結果 150(4行目の100+10行目の50)
一連のログのa:とb:は固定です つまり、途中でc:d→10万などは出てこない また、必ずyの価格が表示されてから取り消し行為と完了行為のどっちかが1回行われます
ベストアンサー
雰囲気的にはこんな感じかと。 細かい条件によって正規表現やgroupsによる除外判定は変わりそうですが。 〇はインデント import re from collections import deque # encodingは手元のファイルに合わせて with open('test.txt', 'r', encoding='utf-8') as f: 〇lines = f.readlines() s = deque([]) for line in lines: 〇# 否定先読みか何かを使えば最初の記号と一致する場合は最初からマッチさせないことも可能なはず 〇match = re.search('(.+): (.+)→([1-9][0-9]{1,2})万', line) 〇if match: 〇〇groups = match.groups() 〇〇value = int(groups[2]) 〇〇# a: a→30万のように一行にaが2回出てきたらその行の価格は無視、yは(10~100まで。)10刻みの判定 〇〇if groups[0] != groups[1] and value <= 100 and value % 10 == 0: 〇〇〇s.append(int(groups[2])) 〇 〇del_match = re.search('.+: →今のは取り消し!!!!', line) 〇if del_match: 〇〇s.pop() print(sum(s))
ID非公開さん
質問者2022/6/29 18:17
ありがとうございます。 概ね期待通りの結果が出ました。 一点だけ私のミスですが、「a: a→30万のように一行にaが2回出てきたらその行の価格は無視する」について、a:の前に接頭文字が付いている場合でも対応できるように修正出来ませんか? 具体的にはca:a→y万のときにyを無視するということです。
質問者からのお礼コメント
ありがとうございました!助かりました!
お礼日時:6/29 20:33