実現したいこと
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)"
だと出来ませんでした。他にもいろいろやったのですが、全くうまくいかず、、正規表現をあまり使い慣れていないこともありますが、どのように学習したら理解できるようになるのかも知りたいです。
正規表現で\はエスケープ文字なので、\を表現するには\\なので\\を表現するには\\\\でしょうか。
\\nなら\\\\nになると思います。
なので
(<=都道府県:).+(?=\\\\n)
ではどうでしょう。
YellowGreenさんありがとうございます!(<=都道府県:).+(?=\\\\n)でやってみたのですができませんでした。私の書いた実行例に「\\n」があるのでややこしかったかもしれません。
ごめんなさい
(?<=都道府県:).+(?=\\\\n)
でした。最初の?が抜けてました。
(?<=都道府県:).+(?=\\)でもいいのでは?
↑は誤りを直接訂正しました。
ありがとうございます。(?<=都道府県:).+(?=\\)でもできませんでした。
しかし自分でもなぜ、それで出来ないかが説明できないので、まだ正規表現を理解できていないと思います
.+ が何を表すかが説明できないです。
.はなんでもいい1文字
+は直前の文字または [...] や (...) で囲まれたものが1個以上連続するものにマッチします。
(?<=都道府県:)(.+?)(?=\\n) でできました。
.+で1文字列以上
.*なら0文字もありです。
当方では、
(?<=都道府県:).+(?=\n\n)
で抽出できました。
ありがとうございます、返信が遅くなり申し訳ありません。私の方では(?<=都道府県:).+(?=\n\n)ではできませんでした
回答1件
あなたの回答
tips
プレビュー