0

我目前正在尝试为我的 Bind9 服务器编写任务脚本。目标是让用户按以下格式输入 IP 地址:

192.168.90.150

然后,我希望 Python 获取该 IP 地址并将其分解为 4 个不同变量中的 4 个不同分组

192.168.90.150 would become...

first  = 192 
second = 168
third  = 90
fourth = 150

我假设这样做的“行业标准”方式是使用正则表达式。我尝试使用以下搜索字符串来识别由句点分隔的 1-3 个数字字符的分组。以下没有奏效。

ipaddy = raw_input('Enter IP address: ')

failsearch1 = re.search(r'\d+\.')
failsearch2 = re.search(r'\d\.')
failsearch3 = re.search(r'(\d)+\.')

for x in ipaddy:
    a = search.failsearch1(x)
    b = search.failsearch2(x)
    c = search.failsearch3(x)
    if a or b or c:
        print('Search found')

上面代码的输出什么都没有。

我还尝试了这些搜索字符串的其他几种变体。有谁知道如何根据时段之间的分隔将典型的 IP 地址(192.168.10.10)转换为 4 个不同的分组?

任何意见,将不胜感激。谢谢。

4

5 回答 5

3

验证: 如何在 Python 中验证 IP 地址?

+加号

第一,第二,第三,第四 = str(ipaddy).split('.')

于 2012-07-21T14:36:10.257 回答
3

如果您有理由确定输入将是点形式的 IPv4,您甚至不需要正则表达式:

assert possible_ip.count(".") == 3
ip_parts = possible_ip.split(".")
ip_parts = [int(part) for part in ip_parts]
first, second, third, fourth = ip_parts
于 2012-07-21T14:36:19.500 回答
1

您可以只使用内置的 str 函数。

try:
    first, second, third, fourth = [int(s) for s in some_text.split('.')]
except ValueError as e:
    print 'Not 4 integers delimited by .'
if not all (0 <= i <= 254 for i in (first, second, third, fourth)):
    print 'Syntax valid, but out of range value: {} in "{}"'.format(i, some_text)
于 2012-07-21T14:39:35.593 回答
0
def validate_and_split_ip(ip):
    parts = ip.split('.')
    if len(parts) != 4:
        return None

    for part in parts:
        if not part.isdigit() or not 0<=int(part)<=255:
            return None
    return [int(part) for part in parts]

测试:

>>> validate_and_split_ip('123.123.0.255')
[123, 123, 0, 255]
>>> validate_and_split_ip('123.123.0.256') # Returns None
>>> validate_and_split_ip('123.123.123.a') # Returns None

然后你有一个列表而不是 4 个变量,这更 Pythonic 和更清洁。

于 2012-07-21T14:48:02.733 回答
0


制作一个字节列表:

>>> [ byte for byte in '192.168.90.150'.split('.') ]
['192', '168', '90', '150']
于 2012-07-21T14:56:29.183 回答