我完全不知道如何正确构造正则表达式来对该文件执行我想要的操作。
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/。
如果有人能帮助我解决这个问题,我将不胜感激。似乎有很多很好的资源可以帮助创建正则表达式,但我完全没有得到它!
我的另一个想法是,我可能可以非常有效地使用 split(' ')
来处理 SS.sss,但我想问是否有人知道正则表达式或 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 位数字 block -
|
- 或 -
\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)
关于python - 正则表达式或分割 (' ' )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41162157/