我正在尝试根据下面的输入创建一个列表,但我没有看到预期的输出。任何人都可以建议我哪里出错了?
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)
答案 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
代替lstrip
:re.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')]