3

文字列でIPv4アドレスまたは次のCIDRブロックのいずれかを確認する必要があります:/16または/24。したがって、192.168.0.1は一致するはずです。192.168.0.0/16が一致する必要があります。192.168.0.0/17は、次の正規表現を使用しているのと一致しないはずです。

re.compile(r'^([0-9]{1,3}\.){3}[0-9]{1,3}(/(16|24))?')

これはすべてのIPアドレスに一致しますが、192.168.0.0/aaaaのような文字列にも一致します

ここで、正規表現を変更した場合(最後に?を削除):

re.compile(r'^([0-9]{1,3}\.){3}[0-9]{1,3}(/(16|24))')

CIDRブロック/16または/24と一致しますが、IPアドレス(例:192.168.0.1)とは一致しなくなります。

「じゃないの?」オプションの発生についてグループをチェックすることになっていますか?私は何が間違っているのですか?

注:IPアドレスの正規表現自体が完全ではないことは知っていますが、説明されている問題についてサポートを得ることに興味があります。

4

4 に答える 4

12

これは機能するはずです:

^([0-9]{1,3}\.){3}[0-9]{1,3}($|/(16|24))$

$行末)または/および16またはをチェックします24

あなたが言ったように?、グループをオプションとしてマークします。つまり、可能であれば、それを試合に含めようとします。ただし、のようにできない場合もありますが、オプションであるため、他の192.168.0.0/aaaa部分と一致します。

そのため、上記の正規表現はニーズにより適しています。/24このようにすると、が、/16または行末で終わる場合にのみ一致が得られます。192.168.0.1

于 2012-08-27T11:42:50.427 に答える
3

正確な一致

まで一致0.0.0.0255.255.255.255ます。CIDRブロックが指定されている場合、CIDRが16またはの場合にのみ一致し24ます。動作中

^                                                 # Start string
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.               # A in A.B.C.D
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.               # B in A.B.C.D
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.               # C in A.B.C.D
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)($|/(16|24))?    # D in A.B.C.D and /16 or /24
$                                                 # End string
于 2012-08-27T13:29:12.867 に答える
1

単一の正規表現でこれにアプローチせざるを得ないと感じる理由はありますか?本当にネイル(*)ですか?Python IPAddrモジュールをインストールして使用し、それを使用してIPアドレスを解析および操作できない理由はありますか?そうすれば、次のようなことができると思います。

#!/usr/bin/env python
import ipaddr
...
mynet = ipaddr.IPv4Network('192.168.0.0/16')
try:
    other = ipaddr.IPv4Network(other_network_string)
    nm = other.netmask
except ipaddr.AddressValueError:
    other = None
    nm = None

...

if nm and nm == mynet.netnmask:
    be_happy()

言い換えれば、誰かがIPアドレス文字列の解析と操作のすべての面倒な作業を行ったパッケージがあります。そのどれだけを本当にコードのためにやり直したいですか?新しいコードをテストし、このパッケージの作成者がおそらく見つけて修正したのと同じ種類のバグを見つけるのにどれくらいの時間を費やしたいですか?

私が少し要点を打ち明けているように聞こえるなら...それは、このアプローチが、すでに作成された既存のテスト済みの堅牢なパーサーを使用するのではなく、正規表現を使用してHTML(またはXML)を解析する試みと完全に類似しているように見えるためです。

  • (手元にある唯一のツールがハンマーである場合、すべての問題は釘のように見えます)
于 2012-08-27T12:11:35.293 に答える
0

'?'のセマンティクス もう少し複雑です(少しだけ)。「おそらく」副詞の同義語のように想像することができます。
これは次のように機能します。私のパターンに一致する部分文字列がある場合は、一致プロセスを続行します。含意のセマンティクスは、前提が満たされない場合でも、文全体がまだ真であると言っているので、IFとTHENを「強調表示」しました。

したがって、この原則をあなたのケースに適用しましょう。'?'を入れます 接尾辞に。前の部分が一致すると仮定して、今度は接尾辞を扱いましょう。パターンに一致する接尾辞がある場合、文字列全体が一致します。接尾辞が一致しない場合、問題はありません。「?」でマークされたブロックです。は「オプション」(「おそらく」セマンティクス、または同等に含意セマンティクスを覚えておいてください)であるため、文字列は引き続き一致します。

したがって、「?」パターンの最後の部分にあるブロックは、一致する接尾辞があるかどうかに関係なく、文字列が一致するため、あまり役に立ちません。実際、オプションのブロックは文字列の途中でのみ役立ちます。

于 2012-08-27T11:54:00.560 に答える