我有一个带有奇怪格式的文本文件,因为您可以看到标题和列不包含单个列,但列可能包含一些空格。
原始文件示例:
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']
答案 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']