2

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

输入:

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)
4

3 回答 3

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而不是lstrip: re.split(r'\W+', s.strip(), 3)

但我不确定你为什么一开始就使用正则表达式,而你可以这样做s.strip().split(None, 3)

于 2012-11-08T02:33:26.693 回答
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']]
于 2012-11-08T02:34:06.997 回答
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')]
于 2012-11-08T02:34:33.097 回答