python-3.x - 使用正则表达式将文本文件拆分为多行记录
问题描述
我想使用时间戳作为分隔符将我的文本分成记录列表。我当前的代码捕获了第一条记录,但没有捕获第二条记录。我应该如何修改我的代码以捕获两者?
s = """13:45:09 HEY HOW ARE YOU
I AM FINE
13:50:10 OK THEN
Bye"""
import re
text_regex = r'^\d\d:\d\d:\d\d(.*?)(?=\d\d:\d\d:\d\d)'
pattern = re.compile(text_regex,re.DOTALL)
records = []
for match in pattern.findall(s):
match = match.rstrip()
records.append(match)
解决方案
我当前的代码捕获了第一条记录,但没有捕获第二条记录。我应该如何修改我的代码以捕获两者?
您的代码不会捕获第二条记录,因为由于尾随(?=\d\d:\d\d:\d\d)
前瞻,它仅在时间戳跟随时才匹配,而最后一条记录并非如此。
Wiktor Stribiżew 的建议如果更正为
records = re.split(r'(?!\A)(?=^\d\d:\d\d:\d\d)', s, flags=re.M)
- 否则,第三个位置参数maxsplit将采用多行标志。
Wiktor Stribiżew 建议的稍微简化的变体,它在第一个时间戳之前删除了额外的文本:
records = re.split(r'(?=\d\d:\d\d:\d\d)', s)[1:]
另一个变体(如在您的原始代码中)不捕获时间戳:
records = re.split(r'\d\d:\d\d:\d\d', s)[1:]
推荐阅读
- javascript - 使用 javascipt 从对象创建对象数组?
- gtkmm - 致命错误:gtkmm.h:没有这样的文件或目录
- reactjs - 调用自定义 Datafetch 挂钩后,如何使用 useReducer 分配初始状态?我一直为空
- c - 如何读取文件中的特定行?
- excel - 如何找到与我在 hh:mm:ss 列中指定的时间最接近的匹配,即每天 24 小时采样?
- java - 如何以类似 Lombok 的方式将方法和字段添加到 Java 类?
- python - Python - 每次循环产生输出Tkinter时通知用户?
- c - 返回值 2、3 和 4 的用途是什么?
- python - 来自嵌套 JSON 的 Pandas 数据框
- python - 如何减少大内存使用对加载的小图像的影响?