0

我有一个格式为的文本文件

AN   text
     text
TI   text
AU   text
     text
     text
CS   text
SO   text

AN   text
TI   text
AU   text
     text
CS   text
     text
SO   text

等等,其中有两个大写字母的关键字,后跟一行或多行的附加文本。

关键字后面的行数可以变化,所以我不能只得到下一个或两个,但关键字的顺序保持不变。

我想要做的是从这些关键字的选择中获取所有文本(例如,只是ANAUSO)。我首先使用readlines()解析文件,然后使用:

sorted_text = []
for line in file:
    if line.startswith('AN'):
        line = line.rstrip('\n')
        sorted_text.append(line)

之后一切都出错了!我的目标是然后将列表中的下一行附加到这一行,除非它以 开头TI,但是任何 elif/else 循环我似乎都尝试附加太多额外的行。

这甚至是解决此类问题的明智方法,还是有更好的方法开始?

4

4 回答 4

0

使用正则表达式:

>>> import re
>>> exp=re.compile(r'^([A-Z]{2})(.+?)(?=(^[A-Z])|\Z)',re.S| re.VERBOSE | re.MULTILINE)
>>> for s in exp.finditer(ifile): print('|',s.group(1),'>',s.group(2))
... 
| AN >    text
     text

| TI >    text

| AU >    text
     text
     text

| CS >    text

| SO >    text


| AN >    text

| TI >    text

| AU >    text
     text

| CS >    text
     text

| SO >    text


>>> print(ifile)
AN   text
     text
TI   text
AU   text
     text
     text
CS   text
SO   text

AN   text
TI   text
AU   text
     text
CS   text
     text
SO   text

所以你在 group(1) 中有 2 个字母的代码,在 group(2) 中有文本。

于 2013-07-26T13:41:00.133 回答
0

尝试这个

from collections import defaultdict

d, k = defaultdict(), None

for line in open(r"C:\Temp\test.txt"):
    data = [s for s in line.split(" ") if s != ""]
    if len(data) > 1: k, t = data[0], data[1]
    else: t = data[0]
    d[k] = d.get(k, "") + t 

print d

如果您想将文本放入列表中,则更d[k] = d.get(k, "") + t改为d.setdefault(k, []).append(t)

于 2013-07-26T13:24:14.143 回答
0

您可以使用“currentKey”变量来跟踪您看到的当前关键字:

currentKey = ''
sorted_text = []
keywords = set(['AN', 'AU', 'SO'])
for line in file:
    if line.startswith('AN'): 
        currentKey = 'AN'
    elif line.startswith('TI'): 
        currentKey = 'TI'
    elif line.startswith('AU'): 
        currentKey = 'AU'
    elif line.startswith('CS'): 
        currentKey = 'CS'
    elif line.startswith('SO'): 
        currentKey = 'SO'

    if currentKey in keywords:
        line = line.rstrip('\n')
        sorted_text.append(line)
于 2013-07-26T13:08:41.330 回答
0

您的文本看起来像 YAML 文件,除了没有冒号 (:)

如果您可以像以下语法一样修改此文件的作者(如果有):

AN:
    text
    text

你可以使用 YAML 解析器。

于 2013-07-26T13:48:37.570 回答