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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

594閲覧

pythonで正規表現を使い、csvファイルの特定の文字と\nの間を抜き出したい

oyatsu8

総合スコア97

Python 3.x

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2023/03/17 12:40

編集2023/03/17 12:51

実現したいこと

pythonで正規表現を使い、csvファイルの特定の文字と\nの間を抜き出したいです。

前提

  • \nは実際の改行ではなく、文章中にある"\n"です。「都道府県:」という文字から、\nの間にある文字列を取り出したいのですが、うまく行かず、文字としての"\n"と実際の改行の区別がよくわからなくなってきました。

発生している問題・エラーメッセージ

% python3 pre.py result:: <re.Match object; span=(53, 137), match='北海道\\n\\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な> result.group(0): 北海道\n\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章 result.group(1): 北海道\n\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章 result:: <re.Match object; span=(53, 136), match='青森\\n\\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文> result.group(0): 青森\n\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章 result.group(1): 青森\n\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章

実現したいのは下記の出力です。

% python3 pre.py result:: <re.Match object; span=(53, 137), match='北海道> result.group(0): 北海道 result.group(1): 北海道 result:: <re.Match object; span=(53, 136), match='青森> result.group(0): 青森 result.group(1): 青森

該当のソースコード

pre.py

1import pandas as pd 2import csv 3import re # 正規表現 4 5df = pd.read_csv('pre.csv',encoding='utf_8') 6data = [] 7pre_regex = r'(?<=都道府県:)(.*)(?=\\n)' 8pre_pattern = re.compile(pre_regex) 9 10for index,row in df.iterrows():#1行ずつ呼び出す 11 result = pre_pattern.search(row.content) 12 print("result::",result) 13 print("result.group(0):",result.group(0))# 14 print("result.group(1):",result.group(1))# 15

pre.csv

1content 2"適当な文章:適当な文章\n適当な文章適当な文章適当な文章適当な文章適当な文章\n 適当な文章\n都道府県:北海道\n\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章\n" 3"適当な文章:適当な文章\n適当な文章適当な文章適当な文章適当な文章適当な文章\n 適当な文章\n都道府県:青森\n\n豚丼が美味しい適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章適当な文章\n" 4

試したこと

process_regex = "(?<=都道府県:).*"だと「都道府県:」以降の文字全てを取得することはできます。
しかし、

process_regex = "(?<=都道府県:).*(?=\n)" process_regex = "(?<=都道府県:).*(?=\\n)"

だと出来ませんでした。他にもいろいろやったのですが、全くうまくいかず、、正規表現をあまり使い慣れていないこともありますが、どのように学習したら理解できるようになるのかも知りたいです。

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

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

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

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

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

YellowGreen

2023/03/17 13:18

正規表現で\はエスケープ文字なので、\を表現するには\\なので\\を表現するには\\\\でしょうか。 \\nなら\\\\nになると思います。 なので (<=都道府県:).+(?=\\\\n) ではどうでしょう。
oyatsu8

2023/03/17 13:40

YellowGreenさんありがとうございます!(<=都道府県:).+(?=\\\\n)でやってみたのですができませんでした。私の書いた実行例に「\\n」があるのでややこしかったかもしれません。
YellowGreen

2023/03/17 13:43

ごめんなさい (?<=都道府県:).+(?=\\\\n) でした。最初の?が抜けてました。
YellowGreen

2023/03/17 13:47 編集

(?<=都道府県:).+(?=\\)でもいいのでは?
YellowGreen

2023/03/17 13:48 編集

↑は誤りを直接訂正しました。
oyatsu8

2023/03/17 13:54

ありがとうございます。(?<=都道府県:).+(?=\\)でもできませんでした。 しかし自分でもなぜ、それで出来ないかが説明できないので、まだ正規表現を理解できていないと思います
oyatsu8

2023/03/17 14:00

.+ が何を表すかが説明できないです。 .はなんでもいい1文字 +は直前の文字または [...] や (...) で囲まれたものが1個以上連続するものにマッチします。 (?<=都道府県:)(.+?)(?=\\n) でできました。
YellowGreen

2023/03/17 14:18

.+で1文字列以上 .*なら0文字もありです。 当方では、 (?<=都道府県:).+(?=\n\n) で抽出できました。
oyatsu8

2023/03/19 05:43

ありがとうございます、返信が遅くなり申し訳ありません。私の方では(?<=都道府県:).+(?=\n\n)ではできませんでした
guest

回答1

0

ベストアンサー

正規表現は、デフォルトでは、貪欲にマッチします。
貪欲にということは「できるだけたくさん」という意味です。
なので、
pre_regex = r'(?<=都道府県:)(.*)(?=\\n)'
の場合、「.」は「\」にも「n」にもマッチするので、「(.*)(?=\n)」の表現が、最後の「\n」までになってしまいます。

解決策としては、

  • (.*)でなく、\以外([^\])などにする
  • (.*)でなく、できるだけ少なく最短マッチ「(.*?)」とする。

あたりでしょうか。

python

1pre_regex = r'(?<=都道府県:)(.*?)(?=\\n)'

投稿2023/03/17 13:04

編集2023/03/17 14:22
TakaiY

総合スコア12765

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

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

oyatsu8

2023/03/17 13:28

TakaiYさんありがとうございます!できました!!貪欲マッチと最短マッチ、ネットで検索して読んではいたのですが理解していませんでした。ようやく理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問