从line.split()中提取多个不相邻字段

3 投票
3 回答
597 浏览
提问于 2025-04-18 10:10

我正在用Python改进一个Shoutcast的日志解析器。

这是一个日志条目的内容:

line = "207.86.121.131 207.86.121.131 2012-11-27 13:02:17 /stream?title=Joe%20Bonamassa%20%2D%20I%20Got%20All%20You%20Need 200 iTunes%2F10%2E7%20%28Windows%3B%20Microsoft%20Windows%207%20x64%20Home%20Premium%20Edition%20Service%20Pack%201%20%28Build%207601%29%29%20AppleWebKit%2F536%2E26%2E9 622592 27 184464"

我想提取字段 0, 5, 8

我的输出应该是 207.86.121.131 200 27

当我单独尝试 line.split()[0](或者5或8)时,可以得到对应的字段,

但是如果我尝试 line.split()[0,5,8],就会出现一个错误,提示:

TypeError: list indices must be integers, not tuple

如果我改为尝试 line.split()[[0,5,8]],也会出现一个错误,提示:

TypeError: list indices must be integers, not list

那么,有没有办法只用一行 line.split 来提取这三个字段呢?

3 个回答

1

你可以试试这个:

' '.join([x for i, x in enumerate(line.split()) if i in (0, 5, 8)])

然后结果是:

'207.86.121.131 200 27'
1

是的,你需要把 line.split() 返回的列表保存下来,然后再获取它的索引。

>>> splitted = line.split()
>>> fields = (x[0], x[5], x[8])
>>> print(fields)
('207.86.121.131', '200', '27')

如果你想用一行代码来实现,可以使用 enumerate() 和列表推导式。

>>> fields = [x for i, x in enumerate(line.split()) if i in (0, 5, 8)]
>>> print fields
['207.86.121.131', '200', '27']
4

你可以使用 itemgetter

>>> from operator import itemgetter
>>> itemgetter(0,5,8)(line.split())
('207.86.121.131', '200', '27')

撰写回答