列表创建不正确

时间:2012-11-08 02:20:02

标签: python

我正在尝试根据下面的输入创建一个列表,但我没有看到预期的输出。任何人都可以建议我哪里出错了?

INPUT:

CR  FA  CL  Title
409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
415560  WLAN    656886  To Record SMD Event Logging

我想要一个像

这样的输出
[['CR', 'FA', 'CL', 'TITLE'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886','To Record SMD Event Logging']]

但是我看到它的创建就像

[['CR', 'FA', 'CL', 'TITLE'], ['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario'], ['', '415560', 'WLAN', '656886\tTo Record SMD Event Logging']]

Python代码

 for i in info.splitlines():
    index = re.split(r'\W+',i,3)
    CRlist.append(index)

3 个答案:

答案 0 :(得分:2)

如果在每行的开头有额外的空格,那么你得到的输出正是你所期望的那样。

这样做的一个常见原因是您尝试使用错误的行结尾解析文件,而不使用通用换行模式,只是让事情无可救药地混淆。

例如,这两行在文本编辑器中看起来可能相同:

409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
\r409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario

但是你的re.split会对他们做出截然不同的事情:

['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario']
['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario']

解决方案是去除多余的空白。您可以尝试编写更复杂的正则表达式,或者只执行re.split(r'\W+', s.lstrip(), 3)

由于您提到过想要删除尾随空格,请使用strip代替lstripre.split(r'\W+', s.strip(), 3)

但我不知道为什么你首先使用正则表达式,只能做s.strip().split(None, 3)

答案 1 :(得分:1)

我觉得你应该使用csv模块,但这是一个非正则表达式的解决方案:

>>> s = '''CR  FA  CL  Title
... 409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
... 415560  WLAN    656886  To Record SMD Event Logging'''
>>> [x.strip().split(None, 3) for x in s.splitlines()]
[['CR', 'FA', 'CL', 'Title'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886', 'To Record SMD Event Logging']]

答案 2 :(得分:0)

如果你有\ t作为分隔符而不是你可以使用它(注意你可以使用strip并检查item.strip()是否检查是否为空条目,如果是,则跳过它):

info = """
          CR  FA  CL  Title
          409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
          415560  WLAN    656886  To Record SMD Event Logging
       """
[[x.strip() for x in row.split('\t') if x.strip()] for row in info.split('\n')]

如果列之间有多个空格,可以尝试使用:

[[x.strip() for x in row.split('  ') if x.strip()] for row in info.split('\n')]

或合并:

[[x.strip() for x in row.replace('\t', '  ').split('  ') if x.strip()] for row in info.split('\n')]

最后使用split(None,3):

[row.split(None, 3) for row in info.split('\n')]