【问题标题】:Python extract sentence after a keyword is foundPython在找到关键字后提取句子
【发布时间】:2021-04-18 17:03:46
【问题描述】:

我有一个基于我提取的一些文本的字符串和一个关键字列表。我想遍历字符串,只提取找到关键字的句子后面的句子,并删除句号。

字符串

'Test string. removing data. keyword extraction. data number. 11123. final answer.'

这是我的关键短语列表:

lst= ['Test string', 'data number']

期望的输出:

['removing data', '11123']

请有人帮我/指出正确的方向吗?谢谢

【问题讨论】:

  • 提示 - 在字符串上使用 str.split() 函数。

标签: python string list for-loop


【解决方案1】:

这是我的建议:

s='Test string. removing data. keyword extraction. data number. 11123. final answer.'

temp = [i.strip() for i in s.split('.')]

res = [temp[temp.index(i)+1] for i in lst]

print(res)

输出:

['removing data', '11123']

它的作用:

temp = [i.strip() for i in s.split('.')]

s.split('.') 将您的字符串转换为字符串列表,按点分隔。因此,您将每个句子分开:

['Test string', ' removing data', ' keyword extraction', ' data number', ' 11123', ' final answer', '']

这被放在list comprehension 中,它从上面的列表中创建一个带有剥离值的新列表(i.strip() 删除了前导和尾随空格)。所以你最终得到:

['Test string', 'removing data', 'keyword extraction', 'data number', '11123', 'final answer', '']

在最后一步有两个有趣的事情:

  1. 我们使用list.index() 方法,它为我们提供了搜索项目的索引。比获得下一个元素更容易。
  2. 当您有一个大字符串和几个搜索项目时,这会很快,但您应该小心,因为如果您正在搜索不存在的项目,它会失败。

直截了当更安全:

res = [temp[idx+1] for idx, val in enumerate(temp) if val in lst]

有关枚举的更多信息,请查看documentation

【讨论】:

  • 几乎与我的想法相同。很棒的代码!
  • 基于一些时间,这似乎是目前最快的建议(不是吨,但仍然是最快的)。在这种情况下,我会说不需要正则表达式,而且这个解决方案非常易读
  • 谢谢 - 易于阅读和很好的解释!
【解决方案2】:

这是一种解决方案。本质上,您根据点和空格拆分输入以制作列表。然后你迭代并查看它是否存在。如果是,则将下一个元素添加到输出列表中。

代码:

input = 'Test string. removing data. keyword extraction. data number. 11123. final answer.'
input_as_list = input.split('. ')
lst = ['Test string', 'data number']
result = []
for i in range(0, len(input_as_list)):
    for item in lst:
        if input_as_list [i] == item :
            result.append(input_as_list [i+1])
print(result)

结果:

['removing data', '11123']

【讨论】:

    【解决方案3】:

    使用list comprehensionre.splitenumerate

    import re
    my_str = 'Test string. removing data. keyword extraction. data number. 11123. final answer.'
    key_phrases = ['Test string', 'data number']
    my_str_phrases = re.split(r'[.]\s*', my_str)
    print([my_str_phrases[idx + 1] for idx, item in enumerate(my_str_phrases) if item in key_phrases])
    # ['removing data', '11123']
    

    注意:
    [.]\s*:文字点(需要是字符类 [] 的一部分或像这样转义:.),后跟 0 次或多次出现的空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-02
      • 2021-07-07
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2014-07-03
      • 1970-01-01
      相关资源
      最近更新 更多