代码之家  ›  专栏  ›  技术社区  ›  thenightmarechild92

使用正则表达式拆分具有唯一标题的子节

  •  2
  • thenightmarechild92  · 技术社区  · 12 月前

    我正在努力找到一种方法,按部分分割我手头的法律文件。我一直在尝试用正则表达式来实现这一点,虽然我已经相当接近了,但我想看看是否有办法进一步优化输出,以整合正则表达式脚本产生的匹配数量。

    每个文档都有多个节标题,但都遵循相同的基本结构。首先,有一个“论证”标题,总结了每个小节中提出的观点。我想包括这个论证部分,因为语料库中的一些文档没有后续的小节;然而,他们中的绝大多数确实有这些部分。每个小节都以罗马数字开头,每个文档中的小节数量可能会有所不同。虽然我不知道每个文档中有多少小节,但我假设不超过10个。

    对于模态文档,结构看起来像:

    string = """ARGUMENT
    Summary of argument
    
    I. TITLE OF SUBSECTION 1
    Text of subsection 1
    
    II. TITLE OF SUBSECTION 2
    Text of subsection 2
    
    CONCLUSION
    Text of conclusion
    """
    

    我创建了一个正则表达式脚本,尝试使用以下命令按标题拆分每个部分 re.split ,指定ARGUMENT标题、罗马数字第1(I)至10(X)小节和结论部分,添加新行符号以避免在这些单词/符号的每个实例上拆分,无论它们是否恰好出现在标题本身中:

    r'(\nARGUMENT|\nI\.|\nII\.|\nIII\.|\nIV\.|\nV\.|\nVI\.|\nVII\.|\nVIII\.|\nIX\.|\nX\.|\nCONCLUSION.*)'
    

    我想要的输出是一个列表,其中每个标题和下面的结果文本都组合成一个元素,如下所示:

    ['ARGUMENT  Summary of argument', 'I. TITLE OF SUBSECTION 1  Text of subsection 1', 'II. TITLE OF SUBSECTION 2  Text of subsection 2', 'CONCLUSION  Text of conclusion']
    

    然而,当使用 re.split 在上述字符串中,我的实际输出将罗马数字与该部分的其余文本分开(注意下面列表的第二和第四个元素:

    ['ARGUMENT\nSummary of argument\n', '\nI.', ' TITLE OF SUBSECTION 1\nText of subsection 1\n', '\nII.', ' TITLE OF SUBSECTION 2\nText of subsection 2\n', '\nCONCLUSION', '\nText of conclusion\n']
    

    输出中的换行符对我来说并不是特别重要。相反,对我来说最重要的是合并标题和标题下的文本。

    我可以对正则表达式脚本进行一些编辑,以获得第一个输出,而不是第二个输出吗?或者,如果没有,我是否可以使用其他正则表达式命令来获得特定的输出?而且,不那么关键的是,是否有一种更有效或更精简的方法将章节标题与脚本中的罗马数字I到X相匹配?

    提前感谢您提供的任何帮助!

    1 回复  |  直到 12 月前
        1
  •  1
  •   QUIET    12 月前

    该模式只是缺少一些关于在您提供的模式中在哪里以及分割什么的说明。我编写了这个模式,它提供了更多关于在哪里分割字符串的说明,并删除了罗马数字冗余。

    string = """ legal doc """
    
    pattern = r'(?=\b(?:[IVXL]+\.)|CONCLUSION)'
    answer = re.split(pattern, string)
    answer = [line.replace('\n', ' ').strip() for line in answer]
    
    print(answer)
    

    假设法律文档将遵循相同的结构,我们可以忽略ARGUMENT部分,从第一点开始分割文本。

    pattern = r'(?=\b(?:[IVXL]+\.)|CONCLUSION)'

    所以,at ?= 我们正在纳入并展望所需的模式。 \b 是单词的边界,这将有助于防止较大的罗马数字分裂。 ?: 是非捕获的,以防止最终答案中的冗余元素。 In [IVXL]+ 我们要求找到这些可能重复的字符,然后使用 \. 我们要求罗马数字以句号结尾。 CONCLUSION 只需将最后一段及其内容拆分。

    answer = [line.replace('\n', ' ').strip() for line in answer]

    这一行是对删除换行符的理解,同时也去除了空格以帮助清理。希望这能有所帮助!