我正在对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}'