Python使用分隔符将行转换为列,数据包含***需要根据该分隔

时间:2017-11-13 09:00:54

标签: python

**START
IB    1107518415
BI    Paperback
BC    JHBC
CO    United Kingdom
ED    Alvarez, R. Michael
**
IB   0415836662
BI   Paperback
AU   Pituch, Keenan A.
AU    Stevens, James P.
BC   JHBC
CO   United Kingdom
EI    6 Rev ed

请查看以上样本数据,我需要在IB->" 1107518415"作为第一行和" 0415836662"作为第二行等等,请帮助我。

2 个答案:

答案 0 :(得分:0)

不完全清楚你想要什么。如果您想要一个包含所有IB行中值的列表,请尝试

res = [line.split(maxsplit=1)[1] for line in data.splitlines() if line.startswith("IB")]
# ['1107518415', '0415836662']

data是一个包含数据的多行字符串。 (当然也可以是文件。)如果要将行拆分为由**分隔的组,可以使用for循环,而不是附加到嵌套列表。

res = []
for line in data.splitlines():
    if line.startswith("**"):
        res.append([])
    else:
        res[-1].append(line.split(maxsplit=1)[1])
# [['1107518415', 'Paperback', 'JHBC', 'United Kingdom', 'Alvarez, R. Michael'],
#  ['0415836662', 'Paperback', 'Pituch, Keenan A.', 'Stevens, James P.', 'JHBC', 'United Kingdom', '6 Rev ed']]

或者使用itertools.groupby作为“单行”,结果相同:

res = [[line.split(maxsplit=1)[1] for line in group] 
       for key, group in itertools.groupby(data.splitlines(), 
                                           key=lambda line: line.startswith("**")) 
       if key == False]

答案 1 :(得分:0)

您可以使用正则表达式(txt包含您的示例字符串):

>>> import re
>>> re.findall(r'^\*\*.*\s+IB\s+(\d+)', txt, re.M)
['1107518415', '0415836662']

Explanation of regex

根据评论更新:

如果你想要所有字段,比如dict,你仍然可以使用正则表达式和循环:

fl=[]
for m in re.finditer(r'^\*\*.*\s+([\s\S]+?)(?=^\*\*|\Z)', txt, re.M):
    di={}
    for s in m.group(1).splitlines():
        k,v=re.split(r'\s+', s, maxsplit=1)
        di[k]=v
    fl.append(di)
>>> fl
[{'ED': 'Alvarez, R. Michael', 'IB': '1107518415', 'CO': 'United Kingdom', 'BI': 'Paperback', 'BC': 'JHBC'}, {'EI': '6 Rev ed', 'BC': 'JHBC', 'BI': 'Paperback', 'AU': 'Stevens, James P.', 'CO': 'United Kingdom', 'IB': '0415836662'}]

或者,您可以使用单个压缩:

>>> [{k:v for k, v in [re.split(r'\s+', s, maxsplit=1) for s in sl]} 
... for sl in 
... [e.splitlines() for e in re.findall(r'^\*\*.*\s+([\s\S]+?)(?=^\*\*|\Z)', txt, re.M)]]
[{'ED': 'Alvarez, R. Michael', 'IB': '1107518415', 'CO': 'United Kingdom', 'BI': 'Paperback', 'BC': 'JHBC'}, {'EI': '6 Rev ed', 'BC': 'JHBC', 'BI': 'Paperback', 'AU': 'Stevens, James P.', 'CO': 'United Kingdom', 'IB': '0415836662'}]