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

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

新規登録して質問してみよう
ただいま回答率
85.35%
正規表現

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

Python

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

Q&A

解決済

1回答

2531閲覧

正規表現で文字列「2020年10月31日(土)~略」から「2020年10月31日(土)」だけを抽出したい Python

fukazume

総合スコア78

正規表現

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

Python

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

0グッド

0クリップ

投稿2020/10/23 03:40

編集2020/10/23 03:49

##■質問

以下のようなリスト項目に対して、Pythonの正規表現reモジュールを用いて、それぞれ日付から始まる文章より
「2020年10月31日(土)」、「2020年11月01日(日)」、「2021年01月11日(月)」というように日付部をゼロ埋めでフォーマットして
抜き出したいですのですが、自らで記述方法を見い出せず、頓挫しております。

説明不足な点など、適宜追記してまいりますので、アドバイスなどいただけます誠にありがたく存じます。
どうぞよろしくお願い申し上げます。

##■試してみたこと
ひとまず、VSCodeの検索置換ウィンドウにて、「^[0-9]{4}年[0-9]{2}月[0-9]{2}日」と書くと、月日が2桁日付の場合のみ抜き出したい範囲を選択できるところまでは漕ぎ着けたのですが、その他のゼロ埋め無し1桁を含む日付の範囲選択方法、余分な範囲の削除、ゼロ埋め有りへの書式変換、のコード記述ができておりません。

###対象のリスト

python

1[ 2 "2020年10月31日(土)は~", 3 "2020年11月1日(日)に~", 4 "2021年1月11日(月)の~" 5 (中略) 6] 7

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

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

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

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

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

dodox86

2020/10/23 03:53 編集

> 抜き出したい範囲を選択できるところまでは漕ぎ着けたのですが、 抜き出すときには0埋めを意識せず「年」、「月」、「日」をそれぞれ取り出し、出力の際にformatメソッドの書式指定で必要な0埋めなどを施せばよいのではないでしょうか。
fukazume

2020/10/23 03:56

早速ありがとうございます!はい、その方が、シンプルなのかもしれません。あとはそこまでにたどり着ければ次のヒントも探すことができるのですが、現在残念ながらそこにまで到達しておりません(T_T)
fukazume

2020/10/23 03:59

手段のこだわりはなく、ゴールにまでシンプルに到達できるに越したことはございません。説明文の方法は私が思いついた一案でございます。どうぞよろしくお願い申し上げます。
dodox86

2020/10/23 04:12

他回答者様より回答をいただけましたのでそちらをご覧いただければと。(重複するので、私は回答しません)
fukazume

2020/10/23 04:16

いえいえ、お読みいただけただけでもありがたく存じます!m(__)m
guest

回答1

0

ベストアンサー

質問中の例やパターンから、日付が先頭に付いているようなので、re.matchを使って年・月・日・曜日に該当する部分を名前付きのグループとして切り出す。

得られた結果を、f文字列を使って埋め込む。0埋めするには値が数値である必要があるため、intで整数に変換した。

Python

1import re 2 3lst = [ 4 "2020年10月31日(土)は土曜日です", 5 "2020年11月1日(日)に遊びます", 6 "2021年1月11日(月)のほげほげ" 7] 8pat = re.compile(r'(?P<year>\d{4})年(?P<month>\d{1,2})月(?P<day>\d{1,2})日[((](?P<weekday>[日月火水木金土])[))]') 9for text in lst: 10 print(text) 11 m = re.match(pat, text) 12 print(f"{m['year']}{int(m['month']):0=2}{int(m['day']):0=2}日({m['weekday']})")

result

12020年10月31日(土)は土曜日です 22020年10月31日(土) 32020年11月1日(日)に遊びます 42020年11月01日(日) 52021年1月11日(月)のほげほげ 62021年01月11日(月)

投稿2020/10/23 04:08

Daregada

総合スコア11990

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

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

fukazume

2020/10/23 04:18

早速のご回答ありがとうございます!書式の理解にもう少し時間を要しますが、まずは御礼申し上げます!
fukazume

2020/10/27 10:35

遅くなり申し訳ございません。先にサンプルコードは取り入れさせていただいたのですが、ようやくじっくりと理解する時間が取れまして、本日Patternやmatchなどを調べました。ゼロ埋めの :0-2 という記述方法も大変参考になりました。正規表現は記号が多くググりにくいのもあり、本当に助かりました!改めまして御礼申し上げます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問