regex或split(“”)?

2024-09-29 03:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我完全不知道如何恰当地构造一个正则表达式来处理这个文件。你知道吗

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和不锈钢,在“时间”列下。你知道吗

目前,我几乎可以分两步完成这项工作-第一步,我可以使用外观时间:

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

据我所知不锈钢值为:

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

但这与AppearanceDate,alpha,delta,cïalpha和cïdelta中的部分值也匹配。你知道吗

最后,以防万一-我在这里测试了:https://regex101.com/,启用了全局和多行标志。你知道吗

如果有人能帮我解决这个问题,我将不胜感激。似乎有很多好的资源来帮助regex的创建,但我却一无所获!你知道吗

我的另一个想法是我可以非常有效地将split(' ')用于不锈钢但我想问,是否有人知道regex或split哪种更有效,因为这将应用于成千上万个类似上面给出的文件。你知道吗

非常感谢!你知道吗


Tags: 文件nohttpsalphatxtcomwww时间
2条回答

你可以用

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

请参阅regex demo(将re.M标志与re.findall一起使用)。你知道吗

详细信息:

  • (?:AppearanceTime\s+|^\d+\s+)-这与两个备选方案匹配
    • AppearanceTime\s+-AppearanceTime字符串和1+空格(\s+
    • |-或
    • ^\d+\s+—行的开始(^)、1+个数字(\d+)和1+个空格
  • (\d{2}:\d{2}:\d{2}|\d{2}\.\d{3})-匹配并捕获re.findall的最终输出)两个备选方案之一:
    • \d{2}:\d{2}:\d{2}-3:-分隔的两位数块
    • |-或
    • \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)
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.+?。你知道吗

相关问题 更多 >