[英]Find all occurences of a pattern in a text file
我有一個看起來像這樣的文本文件
Nmap scan report for 192.168.2.1
Host is up (0.023s latency).
PORT STATE SERVICE
5001/tcp closed commplex-link
MAC Address: EC:1A:59:A2:84:80 (Belkin International)
Nmap scan report for 192.168.2.2
Host is up (0.053s latency).
PORT STATE SERVICE
5001/tcp closed commplex-link
MAC Address: 94:35:0A:F0:47:C2 (Samsung Electronics Co.)
Nmap scan report for 192.168.2.3
Host is up (0.18s latency).
PORT STATE SERVICE
5001/tcp filtered commplex-link
MAC Address: 00:13:CE:C0:E5:F3 (Intel Corporate)
Nmap scan report for 192.168.2.6
Host is up (0.062s latency).
PORT STATE SERVICE
5001/tcp closed commplex-link
MAC Address: 90:21:55:7D:53:4F (HTC)
我想查找端口5001關閉(未過濾)的所有IP。 我嘗試使用以下邏輯來查找所有此類IP
fp = open('nmap_op.txt').read()
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(.*)closed',re.S)
matched = ip.findall(fp)
for item in matched:
print item
我期望輸出是
192.168.2.1
192.168.2.2
192.168.2.6
但是我沒有得到想要的輸出。 輸出只是一個看起來像這樣的項目:
(“ 192.168.2.1”,“ \\ n主機已啟動(延遲0.023秒)。\\ n端口狀態服務\\ n5001 / tcp關閉了復雜鏈接\\ nMAC地址:EC:1A:59:A2:84:80(Belkin International)\\ n \\ n針對192.168.2.2的Nmap掃描報告\\ n主機已啟動(延遲0.053秒)。\\ n端口狀態服務\\ n5001 / tcp關閉了復雜鏈接\\ nMAC地址:94:35:0A:F0:47:C2(三星電子有限公司。)\\ n \\ n針對192.168.2.3 \\ n的Nmap掃描報告\\ n主機已啟動(延遲為0.18s)。\\ n端口狀態服務\\ n5001 / tcp過濾的復雜鏈接\\ nMAC地址:00:13:CE:C0:E5:F3(英特爾公司)\\ n \\ n針對192.168.2.6的Nmap掃描報告\\ n主機已啟動(延遲0.062秒)。\\ n端口狀態服務\\ n5001 / tcp)
我要去哪里錯了?
解決方案:以下邏輯對我有用。 如果有人有更好的答案,請告訴我。
fp = open('nmap_op.txt').read()
entries = re.split('\n\n',fp)
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?closed',re.S)
matched = []
for item in entries:
if ip.search(item):
matched.append(ip.search(item).group(1))
你不需要re.S
這里。 s
修飾符將點元字符( .
)的含義從“ 匹配除換行符以外的所有內容 ”更改為“ 匹配包括換行符在內的所有內容 ”。 您在這里不需要。
第二個捕獲組也不是必需的。 您可以將其刪除以僅返回IP:
>>> matched = re.findall('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*closed', fp)
>>> matched
['192.168.2.1', '192.168.2.2', '192.168.2.6']
由於行格式似乎總是相同的(ip從偏移量21開始並在下一個空格處結束),因此您可以在不使用正則表達式的情況下嘗試另一種方式:
for block in data.split("\n\n"):
if block.find('5001/tcp closed')>0:
print block[21:block.find('\n', 27)]
你可以做:
>>> re.findall(r'^Nmap.*?(\d+\.\d+\.\d+\.\d+).*?5001\/tcp closed', fp, re.M)
# ['192.168.2.1', '192.168.2.2', '192.168.2.6']
解決方案:以下邏輯對我有用。
fp = open('nmap_op.txt').read()
entries = re.split('\n\n',fp)
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?closed',re.S)
matched = []
for item in entries:
if ip.search(item):
matched.append(ip.search(item).group(1))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.