将文本转换为列

时间:2015-08-28 00:58:52

标签: python parsing text

我有一个带有奇怪格式的文本文件,因为您可以看到标题和列不包含单个列,但列可能包含一些空格。

原始文件示例:

    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X

将此文本转换为数组的最有效方法是什么:

['1.2.3.4','17622','5.6.7.8','15932','0xEE531C47','ITU-T G.711 PCMU','60962','2 (0.0%)','106.78','8.55','0.34','X']
  • 第1-5列是1比1.
  • 第6列可能包含3个令牌。
  • 第7列是1比1
  • 第8列包含2个令牌。
  • 第9-12列是1比1.

2 个答案:

答案 0 :(得分:1)

这个正则表达式非常脆弱,但这里有:

>>> import re
>>> line = "1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X"
>>> regex = re.compile(r'^([\d{1,3]\.[\d{1,3]\.[\d{1,3]\.[\d{1,3])\s+(\d+)\s+([\d{1,3]\.[\d{1,3]\.[\d{1,3]\.[\d{1,3])\s+(\d+)\s+(\w+)\s+(.*)\s+(\d+)\s+(\d+\s+\(\d+\.\d+%\))\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\w+)$')
>>> matches = regex.match(line)
>>> list(matches.groups())
['1.2.3.4', '17622', '5.6.7.8', '15932', '0xEE531C47', 'ITU-T G.711 PCMU', '60962', '2 (0.0%)', '106.78', '8.55', '0.34', 'X']

答案 1 :(得分:1)

拆分字符串并将该列表分解为您想要的方式。可能有正则表达式解决方案,但这个解决方案很简单。计算从1到5的列,然后根据第6列决定的列数,然后为其他列向后工作。

>>> data = '  1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X'
>>> values = data.split()
>>> offset = len(values)-7
>>> values[:5] + [' '.join(values[5:offset])] + [values[-7]] + [values[-6] +' '+ values[-5]] + values[-4:]
['1.2.3.4', '17622', '5.6.7.8', '15932', '0xEE531C47', 'ITU-T G.711 PCMU', '60962', '2 (0.0%)', '106.78', '8.55', '0.34', 'X']