是否有任何现有的库将字符串解析为ipv4或ipv6地址,或至少确定字符串是否为IP地址(任何一种)?
答案 0 :(得分:15)
是的,有ipaddr
模块,您可以帮助检查字符串是否是IPv4 / IPv6地址,并检测其版本。
import ipaddr
import sys
try:
ip = ipaddr.IPAddress(sys.argv[1])
print '%s is a correct IP%s address.' % (ip, ip.version)
except ValueError:
print 'address/netmask is invalid: %s' % sys.argv[1]
except:
print 'Usage : %s ip' % sys.argv[0]
但这不是标准模块,因此并不总是可以使用它。
您还尝试使用标准socket
模块:
import socket
try:
socket.inet_aton(addr)
print "ipv4 address"
except socket.error:
print "not ipv4 address"
对于IPv6地址,您必须使用socket.inet_pton(socket.AF_INET6, address)
。
我还想注意,inet_aton
会尝试转换(并真正转换)地址,例如10
,127
等等,这些地址看起来不像IP地址。
答案 1 :(得分:8)
对于IPv4,您可以使用
socket.inet_aton(some_string)
如果它抛出异常,some_string
不是有效的IP地址
对于IPv6,您可以使用:
socket.inet_pton(socket.AF_INET6, some_string)
如果some_string
不是有效地址,它会再次抛出异常。
答案 2 :(得分:4)
IPv4 + IPv6解决方案仅依赖于标准库。返回4
或6
或引发ValueError
。
try:
# Python 3.3+
import ipaddress
def ip_kind(addr):
return ipaddress.ip_address(addr).version
except ImportError:
# Fallback
import socket
def ip_kind(addr):
try:
socket.inet_aton(addr)
return 4
except socket.error: pass
try:
socket.inet_pton(socket.AF_INET6, addr)
return 6
except socket.error: pass
raise ValueError(addr)
答案 3 :(得分:2)
您可以使用import netaddr
if netaddr.valid_ipv4(str_ip) is True:
print("IP is IPv4")
else:
if netaddr.valid_ipv6(str_ip) is True:
print("IP is IPv6")
库。它有valid_ipv4 / valid_ipv6方法:
$time = time();
//Check the date of monday and sunday from this week.
//Strtotime() bug on PHP version 5.5.31. Bug report: https://bugs.php.net/bug.php?id=63740
if(date("l") == "Sunday"){
$monday = date( 'd-m-Y', strtotime( 'monday last week' ) );
$sunday = date( 'd-m-Y', strtotime( 'sunday last week' ) );
//Check the weeknumber of this week.
$weeknumber = date("W", strtotime('+0 day', $time));
} else {
$monday = date( 'd-m-Y', strtotime( 'monday this week' ) );
$sunday = date( 'd-m-Y', strtotime( 'sunday this week' ) );
//Check the weeknumber of this week.
$weeknumber = date("W", strtotime('+1 day', $time));
}
答案 4 :(得分:1)
答案 5 :(得分:1)
答案 6 :(得分:1)
如果您确定该地址有效并且只是想确定它是ipv4还是ipv6,那么仅仅这样做是不够的:
if ":" in address:
print("Ipv6")
else:
print("Ipv4")
答案 7 :(得分:0)
我更喜欢ip_interface,因为它处理带有和不带前缀掩码的情况,例如,“10.1.1.1/24”以及简单地“10.1.1.1”。不用说,适用于v4和v6
..