2015-04-23 122 views
0

我本質上是在Python中製作日誌文件解析程序。我遇到的問題是當我試圖提取一個可變長度的東西,如IP地址。Python:根據字符和字符切分字符串

FILE = importFile.readlines()  
holderString = '' 
cleanUp = [] 

for line in FILE: 
     holderString = line[51:63] 
     if holderString not in cleanUp: 
      cleanUp.append(holderString) 

這段代碼在我已經通過日誌文件解析並提取了包含我正在使用的關鍵字的行之後運行。我真正想要的是能夠從一個特定的索引開始,在這種情況下是51列,因爲IP地址開始的地方是可預測的。問題在哪裏結束?下面是一個例子行:

[02] Mon 01Jan15 00:00:00 - (1234567) Connected to 192.168.1.1 (local address 10.10.10.10, port 80) 

指數,日期,時間,衝刺,會話ID和「連接到」永不長度改變,也沒有自己的位置,但連接的IP地址會改變,從而改變長度(例如:19.18.1.1(長度9)或192.168.100.100(長度15))。

我該如何着手從一個特定的指標開始,結束於一個特定的角色?

+0

如果你的行沒有額外的空間,只需使用'line.split()'。 –

回答

2

切片從指數51至結束的字符串,用空格分開,並使用第一要素。

>>> line = "[02] Mon 01Jan15 00:00:00 - (1234567) Connected to 192.168.1.1 (local address 10.10.10.10, port 80)" 
>>> line[51:].split()[0] 
'192.168.1.1' 

你也可以不用切片部分被分割在空間中的整條生產線,並採取九號分裂元素作爲你的IP地址:

>>> line = "[02] Mon 01Jan15 00:00:00 - (1234567) Connected to 192.168.1.1 (local address 10.10.10.10, port 80)" 
>>> line.split()[8] 
'192.168.1.1' 

的另一種方法是搜索IP在您的在線地址與正則表達式:

>>> import re 
>>> line = "[02] Mon 01Jan15 00:00:00 - (1234567) Connected to 192.168.1.1 (local address 10.10.10.10, port 80)" 
>>> re.search(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", line).group(0) 
'192.168.1.1' 
+0

感謝您的深入響應。正則表達式的例子完美工作!我肯定需要更多地瞭解正則表達式,我不知道它們是一件事情。 –

0

聽起來像你應該使用正則表達式。 import re並觀看文檔https://docs.python.org/2/library/re.html 以下匹配的IP地址......

re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",line) 
+0

我覺得這是解決這個問題的正確方法,但它不會返回任何匹配。我將深入研究文檔並學習更多關於正則表達式的知識。 –

0

你可以使用識別IP地址的正則表達式,或者只是使用

s="[02] Mon 01Jan15 00:00:00 - (1234567) Connected to 192.168.1.1 (local address 10.10.10.10, port 80)" 
ip = s.split()[8] 
相關問題