我试图建立一个类并将每首诗作为一个对象,它具有标题的属性(后跟" POEM:"),作者和内容。 我提取了标题和作者并列入了一个列表。 但是,我不知道如何提取内容,并将其列入清单。
我有一个包含许多诗歌的txt文件。 样本诗是:
POEM: lala AUTHOR: la
aaaaaaaaaaaaaa,
aaaaaaaaa,
akaaaaaaaa
POEM: alal AUTHOR: al
llllllllllll,
llllll.
llllllll,
lllllllllll
POEM: lal AUTHOR:as
sssssssss,
sssssss,
sssssss
这就是我做的事情
import re
f=open('Poems.txt', 'r')
data=f.read().replace('\n','')
re.findall(r"^POEM:.*?(?=POEM)",data)
我想把所有的诗作为单独的字符串放在列表中,但我只能得到第一首诗。
'POEM: lala AUTHOR: la, aaaaaaaaaaaaaa, aaaaaaaaa, akaaaaaaaa'
答案 0 :(得分:0)
解释时,不使用正则表达式就更容易解决。
首先打开文件
f=open('Poems.txt', 'r').read()
您将获得您的诗歌列表,其中包含您在问题的最后部分显示的预期输出
poems_list = ["POEM" + s for s in f.split("POEM")]
我们删除了第一个元素,因为它是空的,这是由于分割函数
poems_list.pop(0)
到此为止,poems_list
会告诉我们其他用户在他的问题中发布的内容。但是如果你真的想要解析数据,我想这是你使用正则表达式的意图,你可以继续下面的内容:
我们回顾诗歌列表中的每首诗来分析它们包含的数据
for poem in poems_list:
首先我们用poem关键字拆分它,记住你必须在分号和诗名之间留一个空格,否则它不会工作(不修改代码)
i1 = poem.split('POEM: ')
现在我们将它由作者拆分,再次留下适当的尾随空格。我们采用i1第二个元素,因为第一个元素是诗名,其余的竞争现在存储在列表的第二个元素中。
i2 = i1[1].split(' AUTHOR: ')
我们将再次使用列表中的第二个元素来获取文本的剩余部分。我们将它拆分为新的一行,因为这首诗在说明其作者之后的换行符开始
i3 = i2[1].split('\n')
我们保存了我们获得的值
poem_name = i2[0]
poem_author = i3[0]
poem_content = i3[1]
现在轮到你按照自己的意愿处理数据了。我建议你把它存放在字典中。
所有代码没有解释(用于复制粘贴):
f=open('Poems.txt', 'r').read()
poems_list = ["POEM" + s for s in f.split("POEM")]
poems_list.pop(0)
for poem in poems_list:
i1 = poem.split('POEM: ')
i2 = i1[1].split(' AUTHOR: ')
i3 = i2[1].split('\n')
poem_name = i2[0]
poem_author = i3[0]
poem_content = i3[1]
我不建议您将该数据存储在该文件中。这是非常低效的,微小的修改会在代码的运行中引起很大的问题,这需要很大的修改。建议使用数据库,pandas,csv格式甚至pickle来存储字典,或者至少将它格式化得更好。
答案 1 :(得分:0)
\s*(?=POEM:)
注意:上面的正则表达式只是捕获空格并断言位置匹配(具有正向前瞻)。有关详细信息,请参阅说明。
基础知识
import re
s = "Your string here"
r = r"\s*(?=POEM:)"
print re.split(r, s)
在实践中(使用您的示例字符串)
import re
s = """POEM: lala AUTHOR: la
aaaaaaaaaaaaaa,
aaaaaaaaa,
akaaaaaaaa
POEM: alal AUTHOR: al
llllllllllll,
llllll.
llllllll,
lllllllllll
POEM: lal AUTHOR:as
sssssssss,
sssssss,
sssssss"""
r = r"\s*(?=POEM:)"
print re.split(r, s)
[
'POEM: lala AUTHOR: la\naaaaaaaaaaaaaa,\naaaaaaaaa,\nakaaaaaaaa',
'POEM: alal AUTHOR: al\nllllllllllll,\nllllll.\n\nllllllll,\nlllllllllll',
'POEM: lal AUTHOR:as\nsssssssss,\nsssssss,\nsssssss'
]
\s*
匹配任意数量的空白字符(?=POEM:)
肯定前瞻,确保匹配POEM:
字面上