2015-04-23 79 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] 
相关问题