Python:根据索引和字符对字符串进行切片

Python: Slicing a String based on Indicies and character

我实际上是在 Python 中制作一个日志文件解析程序。我遇到的问题是当我试图提取可变长度的东西时,例如 IP 地址。

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 和 "Connected to" 的长度和位置都不会改变,但连接 IP 地址确实会改变,因此长度也会改变(例如:19.18.1.1(长度9) 或 192.168.100.100(长度为 15))。

我将如何从特定索引开始并以特定字符结束?

听起来你应该使用正则表达式。 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)

从索引 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'

你也可以在没有切片部分的情况下通过在空格处拆分整行并将第 9 个拆分元素作为你的 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'

您可以使用识别 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]