2016-04-02 9 views
1

Bu koda sahibim ve sonunda bir IP adresine re.findall() yanıtını dönüştürmek istiyorum. Ama her zaman bir hata alırım (aşağıya bakınız).ip adres dizisini re.findall() dizgisine nasıl dönüştürebiliriz dize için yanıt

url = 'http://checkip.dyndns.org' 
request = urllib.urlopen(url).read() 
ip = str(re.findall(r'[0-9]+(?:\.[0-9]+){3}', request)) 
print ip 

Hep

TypeError: not all arguments converted during string formatting 

birisi dönüştürmek için en iyi yolu nedir bana söyleyebilir bu hatayı alabilirsiniz? Teşekkürler.

+0

bir yapılandırılmış sonuç döndürür doğru API ziyade keyfi metin kullanın ve bu konuda endişelenmeyin? Örneğin. https://api.ipify.org/?format=json –

+0

'print ip' iyi çalışıyor ('l' dize dönüştürdüğünüzden [abcd ']' yazdırıyor, ancak beklenen çıktı) [Minimal, Tam ve Doğrulanabilir örnek] sağlayın (http://stackoverflow.com/help/mcve)? –

+0

'' ip = re.findall (r '[0-9] + (?: \. [0-9] +) {3}', istek) [0] '' çalışır? . '' re.findall() '' iki veya daha fazla eleman varsa dizgenin bir listesini döndürürse, o zaman '' string (blah blah) '' başarısız olur, – minhhn2910

cevap

1

Sorun, re.findall()'u bir dizeye dönüştürdüğünüz sanırım, ancak bu işlev yorumlarda belirtildiği gibi bir liste döndürüyor. Yalnızca bir sonuç/tek ip bekliyoruz Yani sizin için en re.findall(...)[0] kullanmaktır ve değilse, o zaman tüm sonuçlarını yazdırabilirsiniz: Şahsen

ips = re.findall(r'[0-9]+(?:\.[0-9]+){3}', request) 
for ip in ips: 
    print str(ip) 

, ben en azından iyi her şeyi yazdırmak olacağını düşünüyorum, ya da re.findall() uzunluğunu kontrol edin, çünkü bu şekilde işleri kolayca gözden kaçabilirsiniz. Ayrıca regex hata ayıklama için size this site tavsiye etmek istiyorum. :)

enter image description here

+1

teşekkürler Keyweeusr, harika çalışıyor. – Feng

İlgili konular