如何使用正则表达式在两个标题之间提取文本,需要复杂的非捕获组

时间:2017-12-12 03:41:30

标签: python regex

我想使用python脚本从大量科学论文中提取摘要。论文全部保存为大型csv中的字符串。我想要这样的事情:extracting text between two headers我可以写一个正则表达式来找到'Abstract'标题。然而,找到下一部分标题证明是困难的。标题因纸张而异。它们可以是ALL CAPS或Just Capitalized。它们可以是一个单词或一个长短语,跨越两行。它们通常后面跟着两个换行符。这就是我想出的: - >

abst = re.findall(r'(?:ABSTRACT\s*\n+|Abstract\s*\n+)(.*?)((?:[A-Z]+|(?:\n(?:[A-Z]+|(?:[A-Z][a-z]+\s*)+)\n+)',row[0],re.DOTALL)

以下是摘要的示例:

  

'... \ nAbstract \ nFactorial隐马尔可夫模型(FHMMs)是强大的模型   顺序\ ndata但它们不能很好地扩展到长序列。我们   为FHMM提出可扩展的推理和学习算法   借鉴随机\变分推理,神经系统的思想   网络和copula文献。与现有方法不同,   提出的算法在\ nlatent中不需要消息传递过程   变量并可以分发到计算机网络以加快速度   学习。我们的实验证实了所提算法的确如此   与经过验证的相比,没有引入进一步的近似偏差   结构化平均场算法,\ n并实现更好的性能   长序列和大型FHMM。\ n \ n1 \ n \ n简介\ n \ n ...'

所以我试图找到'摘要'和'简介'并提取它们之间的文本。然而,它可能是'摘要'和'引言',或摘要和'单层网络和平均场\ n \ nPROXXXATION \ n'

帮助?

1 个答案:

答案 0 :(得分:1)

认识到下一部分有点模糊 - 或许我们可以依赖抽象部分以两个换行结束?

ABSTRACT\n(.*)\n\n

或许我们只是假设下一节标题将以大写字母开头,后跟任意数量的单词字符。 (同样,这也很模糊,并假设摘要中没有\n\n

ABSTRACT\n(.*)\n\n\U[\w\s]*\n\n

也许这会刺激你的进一步摆弄...随意发布不匹配的例子 - 也许我们可以逐步完善它。 N.B :正如Wiktor指出的那样,我无法使用不区分大小写的修饰符。所以整个rx应该与开关一起用于不区分大小写的匹配。

Update1:​​这里的挑战实际上是如何识别新部分已经开始......而不是将其与Abstract中的段落分隔混淆。也许这也可以通过改变相当宽容的[\w\s]*[\w\s]{1,100}来处理,\U只能识别新段落中的文本作为"抽象 - 继承者"的标题。如果它有2到100个字符(注意:2个字符,但由于ABSTRACT\n(.*)\n\n\U[\w\s]{1,100}\n\n (大写字符),限制设置为1。

OR