我在网址列表上运行了与ping的快速rtt比较。我想提取ip所以我可以运行whois并获取地理位置。当我在google.com和facebook.com专门开始的网址列表上运行此操作时会发生的情况是,dip匹配谷歌的正则表达式,但不是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在facebook(#2)上是否失败?为什么呢?
答案 0 :(得分:8)
facebook的IP中有零。 1-9
不包括零。
虽然我们正在使用它,但是使用原始字符串来表示正则表达式:
r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
使用\d
类来匹配数字:
r'\d+\.\d+\.\d+\.\d+'
不要忘记修复其他正则表达式:
r' [\.0-9]+/.*/.*/.* ms'
答案 1 :(得分:2)
您查找IP地址的正则表达式已被删除。这是一个更好的:
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}'