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

时间:2013-02-19 00:52:20

标签: python regex

我在网址列表上运行了与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)上是否失败?为什么呢?

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