首页 > 解决方案 > 使用正则表达式将文本文件拆分为多行记录

问题描述

我想使用时间戳作为分隔符将我的文本分成记录列表。我当前的代码捕获了第一条记录,但没有捕获第二条记录。我应该如何修改我的代码以捕获两者?

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)

标签: python-3.xregexmultiline

解决方案


我当前的代码捕获了第一条记录,但没有捕获第二条记录。我应该如何修改我的代码以捕获两者?

您的代码不会捕获第二条记录,因为由于尾随(?=\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:]

推荐阅读