需要帮助解析此模式的文件“Feb 06 2010 15:49:00.017 MCO”

时间:2010-03-02 17:56:55

标签: vb.net regex

需要解析以此模式开头的数据行“2月06 2010 15:49:00.017 MCO”,其中MCO可以是任意3个字母ID,并返回该行的整个记录​​。我想我可以得到第一部分,但返回剩下的部分是我迷路的地方。

以下是一些示例数据。

  

2010年2月6日15:49:00.017 MCO -I -I -I -I 0.34 527 0.26 0.24 184暂定0.00 0仅雷达-RDR- - - - - 否282356N 0811758W - 3-3
  2010年2月6日15:49:00.017 MLB -I -I -I -I 44.31 3175 -10.05 -10.05 216成立0.00 0仅雷达-RDR- - - - - No 281336N 0812939W - 2-
  2010年2月6日15:49:00.018 MLB -I -I -I -I 44.31 3175 -10.05 -10.05 216成立15.51 99仅雷达-RDR- - - - - No 281336N 0812939W - 2-
  2010年2月6日15:49:00.023 QML N856 7437-V -I 62-V 61-V 67.00 3420 -30.93 15.34 534成立328.53 129钢筋 - - - - - - No 283900N 0815325W - -
  2010年2月6日15:49:00.023 QML N516SP 0723-V -I 22-V 21-V 42.25 3460 -8.19 5.03 146成立243.93 83仅限信标 - - - - - - 否282844N 0812734W - -
  2010年2月6日15:49:00.023 QML 2247-V -I 145-V 144-V 78.88 3443 -39.68 23.68 676成立177.66 368钢筋 - - - - - - No 284719N 0820325W - -
  2010年2月6日15:49:00.023 MLB 1200-V -I 15-V 14-V 45.25 3015 -11.32 -20.97 475成立349.68 88仅限信标 - - - - - - 否280239N 0813104W - -
  2010年2月6日15:49:00.023 MLB 1011-V -I 91-V 90-V 94.50 3264 -56.77 10.21 698成立152.28 187仅限信标 - - - - - - 否283341N 0822244W - -
            - - - - - -

2 个答案:

答案 0 :(得分:0)

从您的示例数据中,您似乎无需在日期之后检查是否存在三个字母的标识符 - 它始终存在。如果这不是一个有效的假设,请向正则表达式添加最后三个字母。此外,根据需要为正则表达式组添加更多分组以对您有用。无论如何:

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对象,那可能会更好。

答案 1 :(得分:0)

好像你的日期+3个字符总是前5个字段(空格作为分隔符)。只需浏览文件,然后对每行进行空格分割。然后得到前5个字段

s=Split(strLineOfFile," ")
wscript.echo s(0),s(1),s(2),s(3),s(4)

不需要正则表达式