繁体   English   中英

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

[英]Regular expression to extract contents between two specific words using python(or 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'

不使用正则表达式的解决方案要容易得多。

逐行说明

首先您打开文件

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]

进一步的想法

我不建议您将数据存储在该文件中。 这是非常低效的,微小的修改会在代码的功能上造成很大的问题,这需要进行大量的修改。 强烈建议使用数据库,大熊猫,csv格式甚至泡菜来存储字典,或者至少格式化一点更好。

查看正则表达式在这里使用

\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:完全匹配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM