4

ユーザーは、ホスト名または IP アドレスのいずれかを入力します。ユーザーがIPアドレスを入力した場合はそのままにしたいが、ユーザーがホスト名を入力した場合は、次の方法を使用してIPアドレスに変換したい:

def convert(hostname):
    command = subprocess.Popen(['host', hostname],
                           stdout=subprocess.PIPE).communicate()[0]

    progress1 = re.findall(r'\d+.', command)
    progress1 = ''.join(progress1)
    return progress1 

どうすればいいのですか?

4

4 に答える 4

6

入力が ip かホスト名かに関係なく ip を取得するには:

ip4 = socket.gethostbyname(ip4_or_hostname)
于 2012-12-20T10:39:34.633 に答える
1

正規表現を使用して入力を照合し、それが IP アドレスかどうかをテストできます

test = re.compile('\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')
result = test.match(hostname)
if not result:
    # no match -> must be an hostname #
    convert(hostname)

その正規表現は無効な IP アドレス (999.999.999.999 など) を許可するため、少し調整する必要がある場合があります。これは簡単な例です。

于 2012-12-20T10:29:47.560 に答える
0

IP アドレスの検証に関して、stackoverflow にはすでに多くの質問があります。

  1. Python での IP アドレス検証
  2. Python での IP アドレスの検証

標準のpythonライブラリ内でこれを行うことができるのに、なぜサブプロセスと通信しているのかお尋ねしたいと思います。

Python の組み込み機能を使用して、ホスト名を IP アドレスに解決することをお勧めします。

これを行うには、 Python ソケット ライブラリをインポートして使用します。

たとえば、リンク 1 にあるコードを使用します。

import socket
import re
regex = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
result = regex.match(address)
if not result:
    address = socket.gethostbyname(address)
于 2012-12-20T10:31:33.247 に答える
0

-私の場合、ホスト名にはセパレーターとしてのみ含めることができます。そのため、必要に応じてコメントを外して使用できます。

import re

regex = "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$"
# string_check= re.compile('[@_!#$%^&*()<>?/\|}{~:.]')
string_check= re.compile('[-]')

ip_host_detail = {}
    
def is_valid_hostname_ip(IpHost):
    # pass regular expression and ip string into search() method
    
    if (re.search(regex, IpHost)):
        print("Valid Ip address")
        ip_host_detail['is_ip'] = 'True'
        ip_host_detail['is_hostname'] = 'False'
        return True
    elif(string_check.search(IpHost)):
        print("Contain hostname")
        ip_host_detail['is_hostname'] = 'True'
        ip_host_detail['is_ip'] = 'False'
            return True
    else:
        print("Invalid Ip address or hostname:- " + str(IpHost))
        ip_host_detail['is_hostname'] = 'False'
        ip_host_detail['is_ip'] = 'False'
        return False
    
    
IpHost = sys.argv[1]
# IpHost = 'RACDC1-VM123'

is_valid_hostname_ip(IpHost)
print(ip_host_detail)
于 2021-08-20T19:27:23.430 に答える