使用python(或nltk)在两个特定单词之间提取内容的正则表达式

时间:2017-12-08 21:41:57

标签: python regex nltk

我试图建立一个类并将每首诗作为一个对象,它具有标题的属性(后跟" 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'

2 个答案:

答案 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)

代码

See regex in use here

\s*(?=POEM:)

注意:上面的正则表达式只是捕获空格并断言位置匹配(具有正向前瞻)。有关详细信息,请参阅说明。

用法

See code in use here

基础知识

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:字面上