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

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

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

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

Q&A

解決済

6回答

4738閲覧

テキストファイルを部分的に出力

yamidora

総合スコア13

Python

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

0グッド

2クリップ

投稿2018/10/26 00:49

編集2018/10/26 01:38

前提・実現したいこと

テキストファイルの特定の部分のみ出力したいです。

報告書 〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇 〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇 ×月第×週の平日予定 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [月曜日の予定]買い物 [火曜日の予定]仕事 [水曜日の予定]仕事 [木曜日の予定]仕事 [金曜日の予定]映画鑑賞 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 土日は未定 のちの変更の可能性あり

このようなテキストファイルの、「~」の部分のみを出力するのに

with open("text.txt", "r") as f: flag = False for line in f: if line.startswith("~"): print(line) flag = not flag elif flag: print(line) else: pass

このようなコードを書きました。しかし、この「~」の中身の
「[×曜日の予定]」の後ろの部分のみを出力するのにはどうしたらよいかわかりません。
理想は

買い物 仕事 仕事 仕事 映画鑑賞

このような形にできたらよいなと思っております。
お力添えいただければ幸いです。

補足情報(FW/ツールのバージョンなど)

python3.6

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

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

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

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

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

guest

回答6

0

a.py

python3

1import re 2 3with open("a.txt", "r") as f: 4 m = re.match('(.*)(^~+$)(.*)(^~+$)(.*)', f.read(), flags=(re.DOTALL | re.MULTILINE)) 5 x = re.sub('[.*]', "", m.group(3)) 6 print(x) 7 # tasks = filter(lambda x: len(x.strip()) > 0, x.splitlines()) 8 # print(list(tasks))

実行例
イメージ説明

コメントにしている部分を有効にすると、
['買い物', '仕事', '仕事', '仕事', '映画鑑賞']
のように list を生成し、それを画面に出力できます。

参考情報

  • Python Tips:正規表現で複数行を扱いたい

https://www.lifewithpython.com/2017/12/python-regular-expression-multiple-lines.html

投稿2018/10/27 05:42

katoy

総合スコア22324

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

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

yamidora

2018/10/29 01:53

簡潔かつ正確な回答ありがとうございます! list生成の処理まで書いていただき、とても助かります!
guest

0

正規表現で二段階に分けて片付けた方が、すっきりしたコードになると思います。
フラグを利用したコードは難解になりがちです。

Python

1import re 2 3 4with open('data.txt') as fin: 5 data = fin.read() 6 7m = re.search(r'(~{10,}).+(\1)', data, flags=re.DOTALL) 8assert m 9 10data = m.group(0) 11# print(data) 12 13for item in re.finditer(r'^[.曜日の予定](.+)$', data, flags=re.MULTILINE): 14 print(item.group(1))

実行結果 Wandbox

買い物 仕事 仕事 仕事 映画鑑賞

投稿2018/10/26 06:16

編集2018/10/26 06:18
LouiS0616

総合スコア35660

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

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

yamidora

2018/10/26 06:40

ありがとうございます! やったことのない処理なのですこし難しく感じますが、チャレンジしてみます!
guest

0

あなたのスクリプトに多少手を加えました。

Python

1import re 2with open("text.txt", "r") as f: 3 flag = False 4 for line in f: 5 if line.startswith("~"): 6 print(line) 7 flag = not flag 8 elif flag: 9 mt = re.search(r'(^\s*[(月|火|水|木|金|土|日)曜日の予定])(.*)',line) 10 if mt != None: 11 print(mt.group(3)) 12 else: 13 pass

投稿2018/10/26 04:40

tatsu99

総合スコア5438

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

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

yamidora

2018/10/26 06:38

ありがとうございます! このようなやり方は思い浮かばなかったので勉強になりました!
guest

0

出力例が、以下のようになっていますが、これは、[X曜日の予定]後の他に、その次の行も出力したいということですか。
買い物

仕事

仕事

仕事

映画鑑賞

もし、[X曜日の予定]の後だけでよいなら、
買い物
仕事
仕事
仕事
映画鑑賞
のようになりますが。

投稿2018/10/26 04:08

tatsu99

総合スコア5438

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

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

yamidora

2018/10/26 04:09

[X曜日の予定]の後だけが出力させたいものです 表現不足で申し訳ありません。
guest

0

ベストアンサー

フォーマットが決まっているようなので、t_obaraさんの回答にあるようにsplitを使用して']'文字のところで分割するのが簡単だと思います。もしくは正規表現を使用して[…]の部分とそれ以降を分けてもいいかもしれません。
今回のケースで該当するのかは分かりませんが、[月曜日の予定]買い物[メモ: …] のように後半にも[]が登場する場合は注意が必要です。

python

1import re 2 3with open("text.txt", "r", encoding='utf-8') as f: 4 flag = False 5 for line in f: 6 if line.startswith("~"): 7 print(line) 8 flag = not flag 9 elif flag: 10 # split()で分割 11 if ']' in line: 12 tmp = line.split(']', maxsplit=1) 13 print(tmp[-1]) 14 15 # 正規表現を使う場合 (import reが必要) 16 r = re.match(r'([.*?])(.*)', line) 17 if r: 18 print(r.group(2)) 19 else: 20 pass

投稿2018/10/26 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yamidora

2018/10/26 06:38

二通りもやりかたを教えて頂きありがとうございます! 思った通りの処理ができそうです!
guest

0

lineに空白で区切られて入っていると思うので、splitを利用して分割すると良いのではないでしょうか。

投稿2018/10/26 01:27

t_obara

総合スコア5488

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

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

yamidora

2018/10/26 01:43

お早い回答ありがとうございます。 大変申し訳ありません。テキストファイルの内容を確認したところ、[]の後ろに空白が入って おりませんでした。質問文を入力する際に元のテキストが手元になく、テキストを貼り付けず直接質問文に入力したため、本来のもとの違う内容になってしまいました。テキストの内容を直接貼り付けたものに修正致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問