簡體   English   中英

從文件中提取有效且唯一的IP地址

[英]extract valid and unique ip address from a file

我需要從文本文件中解析有效且唯一的IP地址。

要解析的樣本文件:

ping working 3.3.3.3
ping not working 8.8.8.888
ping working 5.5.55.6 ip address
I am repeat 3.3.3.3
invalid 0.0.0.266
I am not repeat 8.88.8.255
I am 255.255.255.0
I am 111.111.111.111
I am not valid 355.355.355.355
I am valid 192.168.99.1

碼:

import re
pattern = r"((([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])[ (\[]?(\.|dot)[ )\]]?){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]))"

f = open("parse-me.txt","r")
text = f.read()

ips = [match[0] for match in re.findall(pattern, text)]
print list(set(ips))

當我運行它時,它給出以下輸出:

python parse_ip.py
['111.111.111.111', '255.255.255.0', '192.168.99.1', '3.3.3.3', '0.0.0.26', '8.88.8.25', '5.5.55.6', '8.8.8.88']

255中的最后一位數字以某種方式錯過了輸出。 有人可以幫我解決這個問題嗎?

如果使用以下正則表達式,將解決您的問題:

    pattern = r"(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])[ (\[]?(\.|dot)[ )\]]?){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]))"

如您所見,我只是重新排列了您的正則表達式。 實際上在“ |”中 如果第一個條件為真,則不會進行第二個條件匹配。

但是請注意,此正則表達式在將8.8.88.888解析為8.8.88.88時仍然給出錯誤的結果

我想這是回答您的疑問,但您需要新的正則表達式

如下所述,依靠Python自己的IP地址驗證可能更有意義:

import socket
import re

valid = set()

with open('input.txt') as f_input:
    for ip in re.findall(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', f_input.read()):
        try:
            socket.inet_aton(ip)
            valid.add(ip)
        except socket.error:
            pass

print list(valid)

這將顯示

['111.111.111.111', '255.255.255.0', '8.88.8.255', '192.168.99.1', '3.3.3.3', '5.5.55.6']

希望這會有所幫助

In[61]:
f = open("parse-me.txt","r")
text = f.read()
re.findall( r'[0-9]+(?:\.[0-9]+){3}', text)

Out[62]:
['3.3.3.3',
 '8.8.8.888',
 '5.5.55.6',
 '3.3.3.3',
 '0.0.0.266',
 '8.88.8.255',
 '255.255.255.0',
 '111.111.111.111',
 '355.355.355.355',
 '192.168.99.1']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM