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

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

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

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

Q&A

2回答

1161閲覧

改行を含んだ文字列を抽出したい

Male_soprano

総合スコア10

Python 3.x

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

0グッド

1クリップ

投稿2020/08/18 04:04

編集2020/08/18 04:09

初歩的な質問で恐縮です.
テキストファイルの中から文章がある部分を抽出したいと考えています.
追加の条件として,改行の入ったものもまとめてとってきたいのですが,どうしても改行された行が無視されてしまします.
解決策をご教示いただけますと幸いです.宜しくお願いします.

該当のソースコード

python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3import re 4import pyautogui as pg 5import requests as rq 6import json as js 7import glob 8import os 9from datetime import datetime as dt 10 11#ファイルを開く 12#年月日を抽出して曜日を削除 13for line in open("test.txt", encoding="utf-8"): 14 ma = re.search("202[0-9].[0-9]{1,2}.[0-9]{1,2}", line) 15 if ma: 16 tdt = dt.strptime(ma.group(0), '%Y.%m.%d') 17 tstr = tdt.strftime('%Y-%m-%d') 18 #print(tstr) 19 20#時間,ユーザー名,メッセージを抽出 21for line2 in open("test.txt", encoding="utf-8"): 22 mb = re.search("[0-9][0-9]:[0-9][0-9]", line2) 23 if mb: 24 list = line2.split() 25 time = list[0] 26 hms = time + ":00" 27 28 name = list[1] 29 message = list[2] 30 31 #該当箇所 32 print(message)

txt

12020.08.13 木曜日 223:58 ポプ子 えいえい!怒った? 323:59 ピピ美 怒ってないよ. 42020.08.14 金曜日 501:00 天の声 何気ないマンボが 6サンバ師匠をきずつけた 701:30 ポプ子 エサヒィ~スープゥー 8ドゥラァァァ~イ!!! 902:00 ピピ美 しょーがねーだろ赤ちゃんなんだから

実際の出力

えいえい!怒った? 怒ってないよ. 何気ないマンボが エサヒィ~スープゥー しょーがねーだろ赤ちゃんなんだから

理想の出力結果

えいえい!怒った? 怒ってないよ. 何気ないマンボがサンバ師匠を傷つけた エサヒィ~スープゥードゥラァァァ~イ!!! しょーがねーだろ赤ちゃんなんだから

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

MacOS10.15.4, Python3.7.3, Atom

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

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

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

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

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

guest

回答2

0

各行が空白区切りであり、列数によりどのような行か判別できるなら、以下のような感じで処理できます。

Python

1# テストデータ 2from io import StringIO 3s = """2020.08.13 木曜日 423:58 ポプ子 えいえい!怒った? 523:59 ピピ美 怒ってないよ. 62020.08.14 金曜日 701:00 天の声 何気ないマンボが 8サンバ師匠をきずつけた 901:30 ポプ子 エサヒィ~スープゥー 10ドゥラァァァ~イ!!! 1102:00 ピピ美 しょーがねーだろ赤ちゃんなんだから""" 12 13 14# 貯めておいたセリフを出力 15def print_out(l): 16 if len(l) > 0: 17 print(date, time, persion, ''.join(l)) 18 return [] 19 20date = time = person = '' 21mes = [] # セリフ 22for line in StringIO(s): 23 cols = line.split() 24 n_col = len(cols) 25 26 if n_col == 1: # セリフのみ 27 mes.append(cols[0]) # セリフをためる 28 elif n_col == 2: # 日付と曜日 29 mes = print_out(mes) # 貯めていたセリフを出力 30 date = cols[0] 31 elif n_col == 3: # 時刻と人物とセリフ 32 mes = print_out(mes) # 貯めていたセリフを出力 33 time = cols[0] 34 persion = cols[1] 35 mes.append(cols[2]) # セリフを貯める 36 37print_out(mes) # 貯めていたセリフを出力 38 39#2020.08.13 23:58 ポプ子 えいえい!怒った? 40#2020.08.13 23:59 ピピ美 怒ってないよ. 41#2020.08.14 01:00 天の声 何気ないマンボがサンバ師匠をきずつけた 42#2020.08.14 01:30 ポプ子 エサヒィ~スープゥードゥラァァァ~イ!!! 43#2020.08.14 02:00 ピピ美 しょーがねーだろ赤ちゃんなんだから

投稿2020/08/18 04:25

編集2020/08/18 04:41
can110

総合スコア38278

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

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

guest

0

とても、スマートとは言えませんが・・・。

後半部分だけね

python

1 2line3 = [] 3 4#時間,ユーザー名,メッセージを抽出 5for line2 in open("test.txt", encoding="utf-8"): 6 mb = re.search("[0-9][0-9]:[0-9][0-9]", line2) 7 if mb: 8 list = line2.split() 9 time = list[0] 10 hms = time + ":00" 11 12 name = list[1] 13 message = list[2] 14 15 #該当箇所 16 line3.append(message) 17 else: 18 list = line2.split() 19 20 if (len(list) < 2): 21 line3[len(line3)-1] += list[0] 22 23for line4 in line3: 24 print(line4)

投稿2020/08/18 04:44

showkit

総合スコア1638

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

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

Male_soprano

2020/08/18 04:50

回答してくださり有難うございます. 恐縮ですが,こちらで以下のエラーが出ています. showkit様の出力もご確認いただけますと幸いです. Traceback (most recent call last): File "pyautogui_penta.py", line 33, in <module> line3.append(message) NameError: name 'line3' is not defined
showkit

2020/08/18 04:53

ん? for line2 in open("test.txt", encoding="utf-8"): の前の行に line3 = [] は、記述していますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問