【问题标题】:Regular expression to extract contents between two specific words using python(or nltk)使用python(或nltk)提取两个特定单词之间内容的正则表达式
【发布时间】:2018-05-23 04:26:31
【问题描述】:

我正在尝试构建一个类并将每首诗作为一个对象,它具有标题(后跟“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'

【问题讨论】:

  • 请检查我的回答,或提供一些反馈,看看我们是否为您得到了预期的输出。

标签: python regex nltk


【解决方案1】:

解释说,不使用正则表达式的解决方案要简单得多。

逐行解释

首先打开文件

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:

首先我们用诗歌关键字进行拆分,记住分号和诗歌名称之间必须留一个空格,否则不起作用(无需修改代码)

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

【讨论】:

    【解决方案2】:

    代码

    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: 字面意思相符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多