使用正则表达式解析文本以提取有效段落

时间:2018-06-02 17:09:17

标签: python regex

如何使用正则表达式解析python上的文本以从

之类的内容中提取有效的段落
  

靠近住宿\ n \ n附近的住宿是一个住宿的情况。通过改变镜片的形状,适应性将耐火能力调节到观察对象的距离。问题是

我想提取

  

附近的住宿是一个住宿的情况。通过改变镜头的形状,适应性将耐火能力调整到观察对象的距离。

这意味着有效的文本应该以一段时间结束并摆脱类似&#34的问题;问题是"这是一个未完成的句子以及\ n。

等字符之前的任何内容

另一个例子是

  

<p>神经末梢中可用的多巴胺水平由单胺氧化酶控制,这会使突触前的神经递质失活。 </p> \ n \ n </body></html>

哪个应该提取

  

神经末梢中可用的多巴胺水平由单胺氧化酶控制,其使突触前的神经递质失活。

所以也要摆脱任何html标签

所以我需要在一段时间内结束的干净段落。没有任何换行符或html标签可能会在相关段落之后或之前出现。所有段落或多或少都与我提供的例子相似。

2 个答案:

答案 0 :(得分:1)

我建议从主要任务中删除HTML标记(您应该not do with regex),例如with this solution.

然后可以使用以下正则表达式解决剩下的任务:

(?:^|\n|\.)(.*\.)

我们首先匹配文本的开头(^),新行或文字点。 ?:只是为了使这个组不被捕获。然后我们收集所有内容直到一个点,以贪婪的方式(意味着我们得到最大可能的匹配)。

您可以像这样使用它:

import re
m = re.findall(r"(?:^|\n|\.)(.*\.)", your_string)
if m:
    print(m[0].strip())

答案 1 :(得分:1)

关键是能够准确地陈述以下条件:

  • 开始比赛
  • 继续比赛
  • 结束比赛

在你的情况下,这些似乎是

  • 一个大写字母。的 [A-Z]
  • '\ n','&lt;'中没有任何字符等等,重复一遍。的 [^ \ n&LT;&GT;] +
  • 一个句号。的 \

由于正则表达式默认为greedy,因此结束条件将应用于最长匹配,因此获得多个不包含延续条件的句子。这给出了正则表达式 [A-Z] [^ \ n&lt;&gt;] + \。

from scipy.linalg import block_diag
pd.DataFrame(block_diag(*df_list))

   0  1  2  3  4
0  1  2  0  0  0
1  3  4  0  0  0
2  0  0  5  6  7
3  0  0  8  9  X
4  0  0  Y  Z  0

使用您提供的内容:

>>> import re
>>> matcher = re.compile('[A-Z][^\n<>]+\.')

随意根据需要进行调整。