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

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

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

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

Python

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

Q&A

解決済

1回答

561閲覧

Python テキストリスト 正規表現で抽出する方法

fideo

総合スコア55

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/03/03 03:06

編集2022/03/03 04:12

やりたいこと:
Pythonでテキストを読み込み、
リストから特定文字が含まれていたらその文字を抽出したいです。
リストのデータ毎回変化するので、正規表現で抽出したいです。
正規表現で行うとTypeError: expected stringのエラーが発生します。
リストをスライスする際に特にエラーしません。

リストにてスライスを使わずに正規表現で抽出する方法可能でしょうか。
もしくは別の方法でやり易い方法ありますでしょうか。
もし分かる方がいましたら、教えていただけると幸いです。

エラー内容

Traceback (most recent call last): File "c:\Users\test\Documents\test\textread.py", line 45, in <module> m = re.match(r'([2022年3月1日]+)@([#python]+)@([Python簡単]+)@([#programin]+)\.Enterキーで投稿します', s) File "C:\Program Files\Python39\lib\re.py", line 191, in match return _compile(pattern, flags).match(string) TypeError: expected string or bytes-like object

実現したい内容
スライスした時と同じように抽出したいですが、
スライス使わずに下記のように出力可能でしょうか。

#スライスして投稿情報取得 s=New_list[20:35] print(s) 実現したい出力結果 ['2022年3月1日', '', 'テスト投稿', '', 'TEST', '#python', '#code', '#programin', 'プログラミング', '簡単', 'コーディング', 'Python簡単', 'pythonできること', '', 'Enterキーで投 稿します']

テキストファイル

フォロワー11 コメント5件 Enterキーで投稿します 2022年2月27日 · おはよう! #元気 2022年2月28日 · 本日良い天気 #晴 コメント2件 Enterキーで投稿します 2022年3月1日 · テスト 投稿 TEST #python #code #programin プログラミング 簡単 コーディング Python簡単 pythonできること Enterキーで投稿します 2022年3月2日 · こんにちわ! Enterキーで投稿します 2022年3月3日 · おはようございます! Enterキーで投稿します

全体コード

import locale import re #ファイルパステキスト path = r"C:\Users\test\Desktop\test.txt" #ファイル読み込む with open(path, "r", encoding="utf-8") as f: mylist = f.readlines() print(mylist) #新しいリスト作成して特定の文字を置換 New_list = [] for x in mylist: New_list.append(x.replace("\n", "",).replace(' ', '').replace('·', '').replace('\ufeff', '')) print(str(New_list)) #リスト長さの結果 # l=len(New_list) # print(l) # 39結果 #特定文字がNew_listに含まれているかを調べる # str_match = [s for s in New_list if "Enterキーで投稿します" in s] # print(str_match) #スライスして投稿情報取得 s=New_list[20:35] print(s) #特定文字がNew_listに含まれているかを調べる is_include = "#python" in New_list and "Python簡単" in New_list and "#programin" in New_list print(is_include) if is_include: print("上記の#pythonなどの投稿情報取得") #スライスして投稿情報取得 s=New_list[20:35] print(s) #正規表現で抽出 m = re.match(r'([2022年3月1日]+)@([#python]+)@([Python簡単]+)@([#programin]+)\.Enterキーで投稿します', New_list) print(m) else: print("何もしない")

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1import re 2 3#ファイルパステキスト 4path = r"C:\Users\test\Desktop\test.txt" 5 6with open(path, "r", encoding="utf-8") as f: 7 text = f.read() 8 9text = re.sub(r'[ ·\ufeff]', '', text) 10block = re.findall( 11 r'^\d+年\d+月\d+日$(?:(?!^\d+年\d+月\d+日$).)+?Enterキーで投稿します', 12 text, re.DOTALL|re.MULTILINE) 13 14New_list = [b.split('\n') for b in block] 15search_words = ['#python', 'Python簡単', '#programin'] 16 17for l in New_list: 18 if all(w in l for w in search_words): 19 print(l) 20 21# 22['2022年3月1日', '', 'テスト投稿', '', 'TEST', '#python', '#code', '#programin', 'プログラミング', '簡単', 'コーディング', 'Python簡単', 'pythonできること', '', 'Enterキーで投稿します']

投稿2022/03/03 03:58

編集2022/03/03 04:46
melian

総合スコア19825

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

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

fideo

2022/03/03 04:10

早速回答ありがとうございます。 ただ実現した内容と少しが違います。 スライスを使わずに s = New_list[20:35] 正表現でスライスと同じ結果で出力したいです。 最終的にな出力内容こちらになります。 出力 ['2022年3月1日', '', 'テスト投稿', '', 'TEST', '#python', '#code', '#programin', 'プログラミング', '簡単', 'コーディング', 'Python簡単', 'pythonできること', '', 'Enterキーで投 稿します'] かりにくい説明で申し訳ございませんでした。
fideo

2022/03/03 04:13

誤字ありました。 失礼しました。 分かりにくい説明で申し訳ございませんでした。
melian

2022/03/03 04:46

修正しました。
fideo

2022/03/03 06:20

ありがとうございます。 上記の方法で試してみます。
fideo

2022/03/03 07:14

ありがとうございます。 確認しましたら、問題なくできました。 すいません、もし分かりましたら リストで検索する際に現在下記のように指定しておりますが search_words = ['#python', 'Python簡単', '#programin'] 一つだけ用語そのリストで#pythonが含んだら、 下記のように出力したいです。 in演算子のリストを変更する必要ありますか。 例 search_words = ['#python', 'test'] 出力結果。 ['2022年3月1日', '', 'テスト投稿', '', 'TEST', '#python', '#code', '#programin', 'プログラミング', '簡単', 'コーディング', 'Python簡単', 'pythonできること', '', 'Enterキーで投稿します']
melian

2022/03/03 07:20

if all(w in l for w in search_words): を if any(w in l for w in search_words): に変えてみて下さい(all ⇒ any)。これで search_words に含まれるワードの内、どれか一つでも含まれていれば True になります。
fideo

2022/03/03 07:33

ありがとうございます。勉強になります。 丁寧に教えてくれてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問