在特定表达式后断行并添加到运行列表

时间:2016-03-10 10:01:52

标签: python regex

我有很长的文本文件正在运行测量。这些测量值被一些在我的文本文件中具有几乎相同样式的信息划分。这是原始摘录:

10:10 10 244.576 0 0
10:20 10 244.612 0 0
10:30 10 244.563 0 0
HBCHa 9990 Seite 4
16.02.16
Hafenpegel 
Pegel müM Var 0 Pegelstand
Datum Zeit Intervall müM Q Art
Sonntag, 2. Januar 2000 10:40 10 244.555 0 0
10:50 10 244.592 0 0
11:00 10 244.595 0 0
11:10 10 244.593 0 0   
...

我想要一个只有测量的运行列表。如您所见,一个测量位于信息行内,以Sonntag开头。我的问题是,我想在2000之后打破这一行,并将虚线的第二部分10:40 10 244.555 0 0添加为单独的一行。

我的目标是:

10:20 10 244.612 0 0
10:30 10 244.563 0 0
10:40 10 244.555 0 0
10:50 10 244.592 0 0
11:00 10 244.595 0 0
11:10 10 244.593 0 0
...

到目前为止,我设法选择仅以时间开头的行:

if i.startswith("0") or i.startswith("1") or i.startswith("2"):

并将其添加到新列表中。

我可以选择包含表达式"标记":

的行
f = open(source_file, "r")
data = f.readlines()

for lines in data:
    if re.match("(.*)tag(.*)", lines):
        print lines

没有其他行符合"标记"!

2 个答案:

答案 0 :(得分:1)

如果您可以精确匹配有效信息,则无需担心无效信息。因此,我们将使用正则表达式仅匹配我们想要的数据。

import re

MEASUREMENT_RE = re.compile(r"\b\d{2}:\d{2} \d{2} \d{3}.\d{3} \d \d\b")

with open(source_file, mode="r") as f:
    print "\n".join(MEASUREMENT_RE.findall(f.read()))

的变化:

  • 上下文管理器(with块)用于打开文件以便文件自动关闭
  • read使用而不是readlines,因为将正则表达式应用于每一行而不是所有行都没有意义
  • 通过正则表达式找到的测量值,用于检查您正在查找的数字(如果您需要在任何部分中匹配更多数字,则应进行更改)
  • 在正则表达式中用于强制执行空格或字符串开头/结尾的单词边界(\b)在匹配项周围找到

答案 1 :(得分:0)

这个匹配由冒号,空格和句号分隔的可变长度的数字序列:

import re
p = re.compile(r'\d+:\d+ \d+ \d+.\d+ \d+ \d+')

with open(source_file, "r") as f:
    for line in f:
        line_clean = p.findall(line)
        if any(line_clean):
            print "".join(line_clean)