我完全不知道如何适当地构造一个正则表达式来执行此文件的操作。

https://www.dropbox.com/s/9zadqzbvcg6ogtf/000218.txt?dl=0

AppearanceDate 29.08.2015
AppearanceTime 00:02:18
FrameCount 17
#   time  bright   x      y      alpha     delta   c_x    c_y    c_alpha  c_delta  use
01  18.175 ----  0.052  0.838   19.3755   21.947  -----  -----  --------  -------  no
02  18.215 ----  0.053  0.834   19.3682   21.985  -----  -----  --------  -------  no
03  18.255 ----  0.055  0.830   19.3608   22.024  -----  -----  --------  -------  no
04  18.295  5.1  0.057  0.826   19.3535   22.063  -----  -----   19.3541   22.070  yes
05  18.335  0.4  0.058  0.821   19.3462   22.101  -----  -----   19.3452   22.105  yes
06  18.375  0.3  0.060  0.815   19.3354   22.137  -----  -----   19.3365   22.140  yes
07  18.415  0.3  0.061  0.811   19.3281   22.172  -----  -----   19.3278   22.174  yes
08  18.455  0.2  0.063  0.806   19.3193   22.210  -----  -----   19.3192   22.208  yes
09  18.495  0.2  0.064  0.801   19.3110   22.236  -----  -----   19.3107   22.241  yes
10  18.535  0.2  0.066  0.795   19.3018   22.286  -----  -----   19.3023   22.274  yes
11  18.575  0.1  0.068  0.791   19.2935   22.312  -----  -----   19.2939   22.306  yes
12  18.615 ----  0.069  0.786   19.2861   22.335  -----  -----  --------  -------  no
13  18.655 -0.1  0.070  0.782   19.2788   22.359  -----  -----   19.2776   22.369  yes
14  18.695 -0.1  0.071  0.776   19.2686   22.391  -----  -----   19.2695   22.400  yes
15  18.735 ----  0.073  0.770   19.2583   22.424  -----  -----  --------  -------  no
16  18.775 ----  0.074  0.764   19.2480   22.456  -----  -----  --------  -------  no
17  18.815 ----  0.076  0.758   19.2383   22.488  -----  -----  --------  -------  no


我想同时匹配AppearanceTime中的HH:MM:SS和“时间”列中的SS.sss。

目前,我几乎可以分两个步骤进行操作-首先可以使用AppearanceTime:

r"(\d{2}:\d{2}:\d{2})"

据我对SS.sss值的了解是:

r"(\d{2}[.]\d{3})"

但这会匹配AppearanceDate,alpha,delta,c_alpha和c_delta中的部分值。

最后,以防万一,请在这里进行测试:https://regex101.com/带有全局和多行标志。

如果有人可以帮助我,将不胜感激。似乎有大量的资源可以帮助创建正则表达式,但是我绝对无法做到这一点!

我的另一个想法是,对于SS.sss,我可能可以非常有效地使用split(' '),但是我想问一问,是否有人对regex或split哪个更有效,因为这将适用于成千上万个文件,例如上面给出的那个。

非常感谢!

最佳答案

您可以使用

(?:AppearanceTime\s+|^\d+\s+)(\d{2}:\d{2}:\d{2}|\d{2}\.\d{3})


请参见regex demo(将re.M标志与re.findall一起使用)。

细节:


(?:AppearanceTime\s+|^\d+\s+)-匹配2个选择


AppearanceTime\s+-AppearanceTime字符串和1个以上空格(\s+
|-或
^\d+\s+-行首(^),1+个数字(\d+)和1+空格

(\d{2}:\d{2}:\d{2}|\d{2}\.\d{3})-匹配并捕获(re.findall的最终输出)2种选择之一:


\d{2}:\d{2}:\d{2}-3个:分隔的2位数字块
|-或
\d{2}\.\d{3}-2位数字,.,3位数字子字符串



请参见Python demo

import re
rx = r"(?:AppearanceTime\s+|^\d+\s+)(\d{2}:\d{2}:\d{2}|\d{2}\.\d{3})"
s = <<YOUR STRING HERE>>
res = re.findall(rx, s, flags=re.MULTILINE)
print(res)

09-26 05:12