re.findall()在第一次运行时查找结果,但在第二次运行时不查找结果



我正在对url列表运行一个与ping的快速rtt比较。我想提取ip,这样我就可以运行whois并获得地理位置。当我在一个专门从google.com和facebook.com开始的url列表上运行这个程序时,会发生的情况是,一个ip与谷歌的regex匹配,但与facebook不匹配,尽管ping的输出格式相同。下面的代码可以更好地了解发生了什么

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在脸书(#2)上失败了吗?为什么?

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

 

当我们处理它时,使用正则表达式的原始字符串:

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

使用d类匹配数字:

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

不要忘记修复另一个正则表达式:

r' [.0-9]+/.*/.*/.* ms'

用于查找IP地址的正则表达式标记为b0。这里有一个更好的:

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}'