2017-04-09 8 views
1

ハイフンの有無にかかわらず、数字を16桁の数字の列(ハイフンで区切られた4つの数字の各グループ)を3回以上繰り返すことなくキャッチする必要がありました。なぜこの正規表現パターンは意図したとおりに動作しませんか?

だから私が書いたパターンは、「5133-3367-8912-3456」が3、4回繰り返してもマッチします

a=re.compile(r'(?!(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)') 

しかし、一例です。 (否定的な先読みセクションの問題は何ですか?)

+0

正規表現をまったく使用する必要がありますか?これは、 'str.split'と' collections.Counter'を使って書くと理解しやすくなるようです。 – jonrsharpe

答えて

2

Lookaheadsは、それらの位置にあるチェックだけを行います。その場合は、文字列の先頭にあります。先読みで基本的に文字列全体を確認する場合は、特定のパターンを一致させることができない場合は、.*を追加して文字列をさらに深くすることができます。

あなたの場合、r'(?!.*(\d)\-?\1\-?\1\-?\1)(^d{4}\-?\d{4}\-?\d{4}\-?\d{4}$)'に変更することができます。

また、マイナス位置にあるときに逃げる必要はなく、^の直後にルックアヘッドを移動します。私はPythonの正規表現がどのくらいうまく最適化されているのかわかりませんが、文字列のアンカーの先頭が一致した場合は、最初にマッチします(有効な位置は1つだけです)。^これによって与えられるr'^(?!.*(\d)-?\1-?\1-?\1)(\d{4}-?\d{4}-?\d{4}-?\d{4}$)'

+0

@ RizwanM.Tumanこれは有効なマッチで、マッチします。https://regex101.com/r/CYA4ng/1を参照してください。なぜあなたはそれを疑うか分からない? –

+0

私はこの問題について誤解されてしまいました...そして、そのためのopの投稿の混乱を責めます;) –

関連する問題