**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"作为第二行等等,请帮助我。
答案 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']
根据评论更新:
如果你想要所有字段,比如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'}]