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

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

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

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

Python

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

Q&A

解決済

5回答

18503閲覧

正規表現で日付形式(YYYY/MM/DD)をチェックしたいが、YYYY/MM/DDDでも一致してしまう

salmonosushi

総合スコア19

正規表現

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

Python

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

0グッド

1クリップ

投稿2021/03/16 10:45

編集2021/03/17 02:31

Pythonで日付形式YYYY/MM/DDのチェックを行いたく、
正規表現\d{4}/\d{2}/\d{2} と書きました。

※13月はありえない、とかはチェックしなくてもよいです

すると、2021/03/160 (日付が3文字以上)も正規表現に引っ掛かってしまいます。
これを回避する手段を、ご存知の方がいらっしゃいましたら、教えていただきたいです。
よろしくお願いいたします。

追記です。
チェックする文字列は、YYYY/MM/DD 以外にも文字が含まれています。
finditerで、正規表現に一致する文字列のオブジェクトを取得し、
日付形式の始まる開始インデント、終了インデントを取得する処理を行っています。


pattern = '[\d{4}/\d{2}/\d{2} '
result = re.finditer(pattern, '2021/03/160 あいうえお')
indents = list(m.span() for m in result )

なので完全一致では取得できない認識です。

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

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

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

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

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

swordone

2021/03/16 14:20

Javaタグ関係ないのでは?
guest

回答5

0

ベストアンサー

単語境界 \b を使用しましょう。

Python

1import re 2pattern = r'\b\d{4}/\d{2}/\d{2}\b' 3result = re.findall(pattern, '2021/03/160 あいうえお') 4print(result) # [] 5result = re.findall(pattern, 'あ 2021/03/160 あいうえお') 6print(result) # [] 7result = re.findall(pattern, '2021/03/16 あいうえお') 8print(result) # ['2021/03/16'] 9result = re.findall(pattern, 'あ 2021/03/16 あいうえお') 10print(result) # ['2021/03/16']

投稿2021/03/16 15:13

lehshell

総合スコア1156

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

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

salmonosushi

2021/03/17 02:44

解決しました。ありがとうございました。
guest

0

文字列の先頭・末尾に一致する正規表現を考えれば良いです。
こんな感じで。

^\d{4}/\d{2}/\d{2}$

投稿2021/03/16 11:02

KojiDoi

総合スコア13692

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

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

0

Python

1pattern = '\d{4}/\d{2}/\d{2}(?!\d)'

とか

投稿2021/03/16 19:34

modieu

総合スコア282

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

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

salmonosushi

2021/03/17 02:53

?   直前の文字が 0個か1個 の場合にマッチします。   最長一致。条件に合う最長の部分に一致します。 ( ) 文字を1つのグループにまとめる まで分かったのですが、!ってどういう意味ですか?
modieu

2021/03/17 15:38

否定先読みです
salmonosushi

2021/03/19 06:50

ありがとうございます。 勉強になりました。
guest

0

一般に、正規表現がマッチするかどうか判断する関数は、「その正規表現が対象文字列の一部にでも含まれていたら」という判断をしますので、指定した正規表現の前後に何かが付いていてもマッチします。

前後に何も付いてはいけない場合は、先頭と末尾にマッチするアンカー(錨)を使います。
\A\d{4}/\d{2}/\d{2}\Z

投稿2021/03/16 11:06

otn

総合スコア85766

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

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

salmonosushi

2021/03/17 02:57

ご回答ありがとうございます。 説明が不足してて、後ろに文字がくることがあったので、 教えていただいた正規表現では対応できませんでしたが、 今回はじめて正規表現を使ってノウハウが全然なかったので、勉強になりました。 今後参考にさせてもらいます。
guest

0

基本的に、正規表現は部分一致で判定されます。

完全一致を判定したい場合、先頭・末尾の印を入れて、\A\d{4}/\d{2}/\d{2}\Zのようにしましょう。

投稿2021/03/16 11:02

maisumakun

総合スコア145930

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

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

maisumakun

2021/03/16 11:26 編集

> なので完全一致では取得できない認識です。 では、満たすべきパターンあるいは条件を確定させてください。「2021/03/160 あいうえお」が正しくないという判断すらできません(2021/03/16のあとに、たまたま「0 あいうえお」が来たという状況がありえないかどうかの判断が付きません)。
salmonosushi

2021/03/17 02:58

ご回答ありがとうございました。 説明が不足してて、申し訳ありませんでした。 教えていただいた正規表現では対応できませんでしたが、 今回はじめて正規表現を使ってノウハウが全然なかったので、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問