需要解析以“2010年2月6日15:49:00.017 MCO”模式开始的数据行文件,其中MCO可以是任意3个字母ID,并返回该行的整个记录。我想我可以得到第一部分,但返回的其余部分是我迷路的地方。
以下是一些样本数据。
200620102月06 15:49:00.017 MCO -I -I 0.34 527 0.26 0.24 184只-RDR-编号282356N 0811758W - 3-3
2010年2月06 15:49:00.017 MLB -I -I 44.31 3175 -10.05 216只建立0.00 0雷达-RDR-编号281336N 0812939W - 2-
2010年2月06 15:49:00.018 MLB -I -I 44.31 3175 -10.05 216只建立15.51 99雷达-RDR-编号281336N 0812939W - 2-
2010年2月06 15:49:00.023 QML N856 7437-V -I 62-V 61-V 67.00 3420 -30.93 15.34 534建立了328.53 129增强型-编号283900N 0815325 W
2010年2月06 15:49:00.023 QML N516SP 0723-V -I 22-V 21-V 42.25 3460 -8.19 5.03 146只建立了243.93 83信标
02月06 15:49:00.023 QML 2247-V -I 145-V 144-V 78.88 3443 -39.68 23.68 676成立177.66 368增强型-编号284719N 0820325W
2010年2月06 15:49:00.023 MLB 1200-V -I 15-V 14-V 45.25 3015 -11.32 -20.97 475只建立了349.68 88信标
2010年2月06 15:49:00.023 MLB 1011-V -I 91-V 90-V 94.50 3264 -56.77 10.21 698成立152.28 187信标
发布于 2010-03-03 00:08:11
似乎您的日期+3字符总是前5个字段(以空格作为分隔符)。只需遍历文件,并对每一行在空格上进行分割。然后得到前5个字段
s=Split(strLineOfFile," ")
wscript.echo s(0),s(1),s(2),s(3),s(4)不需要正则表达式
发布于 2010-03-02 18:11:04
从您的示例数据来看,您似乎不必在日期之后检查是否存在三个字母标识符--它总是在那里。如果这不是一个有效的假设,那么在正则表达式中添加最后三个字母。此外,根据需要添加更多的分组,以使regex组对您有用。总之:
import re
dtre = re.compile(r'^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]{2} [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}')
[line for line in file if dtre.match(line)]将其包装在with语句或任何打开文件的东西中,然后在所生成的列表中执行所需的任何处理。
另一种可能是使用生成器表达式而不是列表理解(将外部[和]替换为(和) )。如果您要将结果输出到某个地方,那么这个文件是很大的,并且您不需要为了不同的目的将其全部存储在内存中,这是非常有用的。如果采用这种方法,请确保在使用整个生成器之前不要关闭该文件!
此外,您还可以使用datetime的内置解析工具:
import datetime
for line in file:
try:
# the line[:24] bit assumes you're always going to have three-digit
# µs part
dt = datetime.datetime.strptime(line[:24], '%b %d %Y %H:%M:%S.%f')
except ValueError:
# a ValueError means the beginning of the line isn't parseable as datetime
continue
# do something with the line; the datetime is already parsed and stored in dt如果您无论如何都要创建datetime.datetime对象,这可能会更好。
https://stackoverflow.com/questions/2365445
复制相似问题