首页 > 解决方案 > 下一个文档开始后结束循环(Python 3)

问题描述

一旦下一个条目开始,我想结束一个循环。例如,假设我有以下由三个文档组成的 txt 文件:

Document 1
text1
text1
tex1
Document 2
text2
text2
text2    
Document 3
text3
text3
text3

我正在尝试构建一个JSON文件,该文件将单个文章中的每个文本连接起来。例如'body' = text1 text1 text1'body' = text2 text2 text2; 和'body' = text2 text2 text2。为此,我搜索该单词Document,然后基本上将其后面的文本连接成一行。问题是我的代码跳过了一个文档,所以它只适用于文档 1 和 3:

for line in f:
    if re.search(r"Document ", line):
        text = ''
        while not re.search(r"Document ", line):
            text += line+' '                     
        article['body'] = text

关于如何while not在下一个文档开始后告诉代码停止()的任何想法?

标签: jsonregexpython-3.xloops

解决方案


如果我们使用正则表达式并且我们可以在正则表达式中完成所有操作,那么让正则表达式完成艰苦的工作:

>>> regex = r"Document\s+\d+((?:(?!\s*Document\s+\d+)\s*.*)+)"
>>> re.findall(regex, str)

输出

['text1\ntext1\ntex1', 'text2\ntext2\ntext2', 'text3\ntext3\ntext3']

在此处查看现场演示

正则表达式分解:

  • Document\s+\d+匹配分隔符字符串
  • (开始捕获组 #1
    • (?:非捕获组的开始
      • (?!\s*Document\s+\d+)如果我们没有到达下一个分隔符
      • \s*.*匹配当前行
    • )+非捕获组结束,尽可能重复
  • )捕获组 #1 结束

推荐阅读