我试图解析一个包含很多这样的行的txt文件:
470115572 cms_trk_dcs_05:CAEN/CMS_TRACKER_SY1527_7/branchController00/easyCrate3/easyBoard16/channel003
我正在创建一个字典,其中键是该行的第一个数字,并且值(对于每个键)由斜杠"/"
分隔的单词,每个单词都保存到一个列表中,例如list1
获取所有cms_trk_dcs_05:CAEN
,list2
全部为CMS_TRACKER_SY1527_7
等等
但是当我使用pattern = re.split('\W',line)
分割线时,它会考虑到
":"
字符,我的意思是当我尝试打印cms_trk_dcs_05:CAEN
时它只返回cms_trk_dcs_05
,如何在列表中保存所有单词cms_trk_dcs_05:CAEN
,并保存在我的列表中所有用斜线分隔的单词
我是python的新手,所以如果这是dummys,我道歉 无论如何,提前谢谢你
答案 0 :(得分:0)
使用split()
首先匹配数字后的空格,然后匹配'/':
>>> stringin = "470115572 cms_trk_dcs_05:CAEN/CMS_TRACKER_SY1527_7/branchController00/easyCrate3/easyBoard16/channel003"
>>> splitstring = stringin.split(' ')
>>> num = splitstring[0]
>>> stringlist = splitstring[1].split('/')
>>> num
'470115572'
>>> stringlist
['cms_trk_dcs_05:CAEN', 'CMS_TRACKER_SY1527_7', 'branchController00', 'easyCrate3', 'easyBoard16', 'channel003']
>>>
或者作为一个(不太明显的)单线:
>>> [x.split('/') for x in stringin.split(' ')]
[['470115572'], ['cms_trk_dcs_05:CAEN', 'CMS_TRACKER_SY1527_7', 'branchController00', 'easyCrate3', 'easyBoard16', 'channel003']]
请注意,第二种方法是将第一个元素创建为列表。
答案 1 :(得分:0)
与Trimax的评论一样::
(冒号)是一个非单词字符,因此要正确分割线条,您需要将其包含在模式中。或者使用SiHa的答案。
关于模式,\W
等于[^a-zA-Z0-9_]
(https://docs.python.org/2/library/re.html#regular-expression-syntax),因此您只需添加冒号即可:[^a-zA-Z0-9_:]
至于第二部分,只使用结果列表的第一个元素作为dict键,并以切片的形式为其分配剩余列表。 像这样:
result_dict = {}
for line in file_lines:
line_splitted = re.split('[^a-zA-Z0-9_:]+', line)
result_dict[line_splitted[0]] = line_splitted[1:]
但请注意,如果您的文字包含具有相同数字的行,那么您将丢失数据,就像将新值(在这种情况下为单词列表)分配给现有密钥一样,它将覆盖以前的值。