19

次のIPアドレスの検証では、それが有効なIPアドレスであるかどうかを確認したいのですが、以下を使用してこれを行うにはどうすればよいですか?

>>> ip="241.1.1.112343434" 
>>> aa=re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^0-9]",ip)
>>> aa.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
4

5 に答える 5

40

ライブラリ関数を使用して IP アドレスを検証してみませんか?

>>> ip="241.1.1.112343434" 
>>> socket.inet_aton(ip)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.error: illegal IP address string passed to inet_aton
于 2012-04-10T10:05:24.250 に答える
36

代わりにアンカーを使用します。

aa=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",ip)

これらは、文字列の開始と終了が正規表現の開始と終了で一致することを確認します。^(まあ、技術的には、開始アンカーはメソッドで暗黙的であるため、必要ありません.match())。

次に、その結​​果にアクセスする前に、正規表現が実際に一致したかどうかを確認します。

if aa:
    ip = aa.group()

もちろん、これは IP アドレスを検証するための良い方法ではありません (適切な方法については gnibbler の回答を参照してください)。ただし、正規表現は、より大きな文字列で IP アドレスを検出するのに役立ちます。

ip_candidates = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", ip)

ここでは、\b単語境界アンカーにより、各セグメントの数字が 3 を超えないようにしています。

于 2012-04-10T10:04:23.750 に答える
20

\d{1,3}00のような数字と一致333し、有効な ID にはなりません。

これは、smink からの優れた回答です。

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
于 2012-04-10T10:05:41.133 に答える
15
try:
    parts = ip.split('.')
    return len(parts) == 4 and all(0 <= int(part) < 256 for part in parts)
except ValueError:
    return False # one of the 'parts' not convertible to integer
except (AttributeError, TypeError):
    return False # `ip` isn't even a string
于 2012-04-10T11:59:01.557 に答える
3

以下は、IP が有効かどうかをチェックします。IP が 0.0.0.0 から 255.255.255.255 の範囲内にある場合、出力は true になり、そうでない場合は false になります。

[0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4

例:

your_ip = "10.10.10.10"
[0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4

出力:

>>> your_ip = "10.10.10.10"
>>> [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4
True
>>> your_ip = "10.10.10.256"
>>> [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4
False
>>>
于 2016-03-11T12:55:46.430 に答える