【问题标题】:Splitting text file into multiline records using regex使用正则表达式将文本文件拆分为多行记录
【发布时间】:2021-03-13 20:20:18
【问题描述】:

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

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)

【问题讨论】:

  • 可能,只要使用records = re.split(r'(?!\A)(?=^\d\d:\d\d:\d\d)', s, re.M) (demo)。

标签: python-3.x regex multiline


【解决方案1】:

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

您的代码未捕获第二条记录,因为由于尾随 (?=\d\d:\d\d:\d\d) 前瞻,它仅在时间戳之后才匹配,而最后一条记录则不然。
Wiktor Stribiżew 的建议如果更正为有效

records = re.split(r'(?!\A)(?=^\d\d:\d\d:\d\d)', s, flags=re.M)

- 否则 multiline 标志将被用于第三个位置参数 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:]

【讨论】:

  • 我承认我在评论中missed flags=。尽管如此,如果数据不在字符串的开头,这将不起作用,并且当示例文本如此“通用”时,这部分总是不清楚。
  • 你是对的;这个例子是否代表真实数据通常是值得怀疑的。我添加了您的解决方案的一些变体。
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2023-03-23
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2016-08-04
相关资源
最近更新 更多