json - 下一个文档开始后结束循环(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
在下一个文档开始后告诉代码停止()的任何想法?
解决方案
如果我们使用正则表达式并且我们可以在正则表达式中完成所有操作,那么让正则表达式完成艰苦的工作:
>>> 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 结束
推荐阅读
- javascript - 如何在 JavaScript 中将 promise 与多个子异步请求链接起来?
- google-apps-script - 如何将每一行发送到另一个电子表格,其名称存储在该行的单元格中?
- single-sign-on - 如何在 Keycloak 中初始化多个 UserProviders
- javascript - React - 通过单击提交按钮将项目从输入添加到列表
- python - 如何对数据框值进行分组、排序和填充
- sql - 如何从 Google Docs 注册表单中识别 Google Sheets 中的重复项?
- azure - 使用 ADFV2 连接 DB2/IDAA 时出错
- node.js - ORDER BY 续集 nodeJS
- ruby-on-rails - 如何从 $PATH 中完全删除 rvm?Ruby gemfile 特异性错误
- zapier - Zapier 代码 XMLHttpRequest() 说 XMLHttpRequest 没有定义