パスワードのバリデーションのようなものを正規表現を使って書いていたのですが、
なぜ下記のような結果になるのかよくわからないです。
python
1import re 2 3argStr = '123aBcde' 4 5print('*1*') 6print(re.compile(r'.*(?=.*?[a-z])').search(argStr).group()) 7print(re.compile(r'.*(?=.*[a-z])').search(argStr).group()) 8#文字列を切り出すため、肯定先読みの表現の前に「.*」を入れています 9 10print('*2*') 11print(re.compile(r'(.*?[a-z])').search(argStr).group()) 12print(re.compile(r'(.*[a-z])').search(argStr).group()) 13
期待値
*1*
123a 123(※訂正しました)
123aBcde 123aBcd(※訂正しました)
*2*
123a
123aBcde
実行
*1*
123aBcde 123aBcd(※訂正しました) ・・・(*)
123aBcde 123aBcd(※訂正しました)
*2*
123a
123aBcde
非貪欲マッチを指定しているので、(*)でも「123a」となると思っていたのですが、
そのようになりませんでした。
(?=.pattern)と(?=.?pattern)の実行結果はなぜ同じになってしまうのでしょうか。
ご教示賜りたいです。
**************
すみません、期待値および実行結果に一部タイプミスがあったため、訂正いたしました。
**追記**********
本来やろうとしていたことは、下記のようなバリデーションチェックです。
・英小文字、英大文字、数字がそれぞれ1文字以上あること
・全体で8文字以上であること
これ自体は、「^(?=.[a-z])(?=.[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$」とすればよいことが確認できました。
ただ、上記の書き方にたどりつくまでにいくつか調べていたところ、
今回質問したように「.?*」という書き方をしているものがありました。
https://qiita.com/momotaro98/items/460c6cac14473765ec14
passw0rd という文字列であれば、pとして行頭が^(?=.?[a-z])にマッチしていることになり、また、passw0として行頭が^(?=.?\d)にマッチしていることになります。
上記のとおりだと、(*)の実行結果は「123」になるのでは?と思ったのが、今回の質問のきっかけです。
回答2件
あなたの回答
tips
プレビュー