我有很长的文本文件正在运行测量。这些测量值被一些在我的文本文件中具有几乎相同样式的信息划分。这是原始摘录:
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
没有其他行符合"标记"!
答案 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)