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

2024-09-25 14:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立一个类,并将每首诗作为一个对象,它具有标题(后面是“诗:”)、作者和内容的属性。 我提取了书名和作者,并列出了一份清单。 但是,我不知道如何提取内容,并放入一个列表。在

我有一个txt文件,其中包括许多诗。 诗歌样本包括:

POEM: lala AUTHOR: la
aaaaaaaaaaaaaa,
aaaaaaaaa,
akaaaaaaaa

POEM: alal AUTHOR: al
llllllllllll,
llllll.

llllllll,
lllllllllll

POEM: lal AUTHOR:as
sssssssss,
sssssss,
sssssss

我就是这么做的

^{pr2}$

我想把所有的诗单独列在一个列表中,但我只能得到第一首诗。在

'POEM: lala AUTHOR: la, aaaaaaaaaaaaaa, aaaaaaaaa, akaaaaaaaa'

Tags: 对象标题内容列表属性作者laauthor
2条回答

解释说,不使用正则表达式更容易解决问题。在

逐行解释

首先打开文件

f=open('Poems.txt', 'r').read()

你将得到你的诗歌列表,其中包含你在问题最后一部分中展示的预期输出

^{pr2}$

我们删除第一个元素,因为它是空的,这是由于split函数

poems_list.pop(0)

到目前为止,poems_list将给出另一个用户在他的问题中发布的内容。但是,如果您真的想解析数据,我想这是您使用regex的目的,那么您可以继续执行以下操作:

我们检查了诗歌列表中的每首诗,分析它们所包含的数据

for poem in poems_list:

首先,我们用porse关键字分割它,记住你必须在分号和诗名之间留一个空格,否则它将无法工作(不修改代码)

    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来存储字典,或者至少格式化得更好一些。在

代码

See regex in use here

\s*(?=POEM:)

注意:上面的regex只是捕捉空白并断言位置匹配(使用正的lookahead)。有关详细信息,请参阅说明。在

用法

See code in use here

基本知识

^{pr2}$

在实践中(使用示例字符串)

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:)积极的前瞻确保后面的内容与{}完全匹配

相关问题 更多 >