Python从文本文件中提取段落:拆分带有多个嵌套定界符的完全匹配的字符串

时间:2019-04-14 23:59:25

标签: python regex string text split

我正在阅读数百个pdf文件以提取摘要。我的策略是: (1)在定界符abstract之后分割 (2)阅读摘要 (3)空行时停止。 这是可以执行此操作的代码:

import re    
raw = ' Some text\n\nABSTRACT\nExtract \nthis text\n\nOther text'
pattern = 'abstract'
abstract = re.split(pattern ,raw, flags=re.IGNORECASE)[1].split("\n\n")[0]
print(abstract)

问题在于,不同的pdf文件将为我的分隔符(例如abstract:abstract:\nabstract\n)包含不同的形式,它们都是嵌套的。因此,我尝试了这样的事情:

    import re    
    raw = ' Some text\n\nAbstract:\n\nExtract \nthis text\n and include 
 abstraction and Abstraction \n\nOther text'
    pattern = 'abstract|abstract:|abstract:\n' 
    abstract = re.split(pattern, raw, flags=re.IGNORECASE)[1].split("\n\n")[0]
    print(abstract)

但是对于上面的示例,它不起作用。同样,此代码也无法完全匹配。例如,它不会忽略abstractionAbstraction

2 个答案:

答案 0 :(得分:1)

在要拆分的模式中,对它们进行排序,例如,如果一个是另一个的子集,则将其列在列表中

pattern = 'abstract:|abstract'

不要担心分割中的尾随空格(\n\n\n\n\t),之后请使用.strip()来解决,因为这会删除所有字符串末尾的空白。

text_after_abstract_header = re.split(pattern, raw, flags=re.IGNORECASE)[1]
abstract = text_after_abstract_header.strip().split('\n\n')

答案 1 :(得分:1)

您可以在正则表达式中添加尽可能多的细节,在这种情况下,我们可以在abstract之前和之后添加字符

>>> raw=' Some text\n\nABSTRACT:\t\nExtract this text\n adasdd\n\nSome other text'
>>> arr = re.split('(?i)\n{1,2}abstract[:\n\t]+',raw)[1].split('\n\n')
>>> arr
['Extract this text\n adasdd', 'Some other text']
>>> arr[0]
'Extract this text\n adasdd'

(?i)flags=re.IGNORECASE
\n{1,2} 1或2个换行符
[:\n\t]+包含1次或多次字符列表。