2016-12-15 67 views
1

我完全迷失在如何适当地构造一个正则表达式来做我想要的这个文件。正则表达式或拆分('')?

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 

我想同时匹配HH:MM:SS从AppearanceTime和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,但我想问问任何人是否有一个正则表达式或分裂更有效的想法,因为这将应用于成千上万像上面给出的文件。

非常感谢!

+2

您可以在问题 –

+0

中发布文本数据尝试像这样'r“^ AppearanceTime(。*)|^AppearanceDate(。*)”gm' –

+0

我的建议是使用'split('')'然后跳过3行并完成其余的操作 – Saksow

回答

1

您可以使用

(?: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字符串和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) 
1
match = re.findall(r'^\d.+?(\d{2}[.]\d{3})', txt, flags=re.MULTILINE) 
print(match) 

出来:

['18.175', '18.215', '18.255', '18.295', '18.335', '18.375', '18.415', '18.455', '18.495', '18.535', '18.575', '18.615', '18.655', '18.695', '18.735', '18.775', '18.815'] 

只使用多模式,每行的比赛首先由^\d^\d.+?出现。