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 アドレスを検証する方法は?

+プラス

1 番目、2 番目、3 番目、4 番目 = 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 に答える