0

我正在对 url 列表中的 ping 进行快速 rtt 比较。我想提取 ip,这样我就可以运行 whois 并获取地理位置。当我在一个以 google.com 和 facebook.com 开头的 url 列表上运行它时会发生什么,即使 ping 的输出格式相同,ip 与 google 的正则表达式匹配,但不是 facebook。下面的代码可以更好地了解正在发生的事情。

urls = ["google.com", "facebook.com"]
ip_regex = re.compile('[1-9]+\\.[1-9]+\\.[1-9]+\\.[1-9]+')
time_regex = re.compile(' [\.1-9]+/.*/.*/.* ms') 

for url in urls:
    output = ""
    print url

    ping = subprocess.Popen(["ping", "-c", "3", url], stdout=subprocess.PIPE)

    while ping.poll() == None:
        output += ping.stdout.read()

    output += ping.stdout.read()

    #DEBUG
    print "OUTPUT"
    print output

    ip = ip_regex.findall(output)
    print ip

    ip = ip[0]

    times = time_regex.findall(output)

    print times

    os.system('whois ' + ip + ' | egrep "Country|StateProv|City"')

其他人的 ip_regex 在 facebook (#2) 上是否失败?为什么?

4

2 回答 2

8

facebook 的 IP 中有零。1-9不包括零。

 

当我们这样做时,将原始字符串用于正则表达式:

r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'

使用\d类匹配数字:

r'\d+\.\d+\.\d+\.\d+'

不要忘记修复其他正则表达式:

r' [\.0-9]+/.*/.*/.* ms'
于 2013-02-19T00:56:07.983 回答
2

您用于查找 IP 地址的正则表达式是 b0rked。这是一个更好的:

ip_pattern = r'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}'
于 2013-02-19T01:01:29.003 回答