2016-12-15 5 views
1

Je suis complètement perdu avec la façon de construire correctement une expression régulière pour faire ce que je veux avec ce fichier.regex ou split ('')?

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 

Je voudrais correspondre à la fois le HH: MM: SS de AppearanceTime et le SS.sss, sous la colonne "Time".

Actuellement je peux presque le faire en deux étapes - d'une part pour AppearanceTime je peux utiliser:

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

Pour autant que j'ai avec les valeurs ss.sss est:

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

mais cela correspond également à une partie des valeurs de AppearanceDate, alpha, delta, c_alpha et c_delta. Enfin, juste au cas où cela soit important - j'ai testé ici: https://regex101.com/ avec les indicateurs globaux et multilignes sur.

Si quelqu'un pouvait m'aider avec cela, il serait très apprécié. Il semble y avoir un tas de bonnes ressources pour aider à la création de regex mais je ne reçois absolument nulle part avec ça! Une autre idée que j'avais était que je pourrais probablement utiliser split(' ') assez efficacement pour le SS.sss mais je voulais demander si quelqu'un a une idée de ce qui de regex ou split est plus efficace car cela sera appliqué à plusieurs milliers de des fichiers comme celui donné ci-dessus.

Merci beaucoup!

+2

vous pouvez poster des données de texte dans la question –

+0

Essayez comme ceci 'r"^AppearanceTime (. *) |^AppearanceDate (. *) "Gm' –

+0

Mon conseil utilise' split ('') 'pour les deux, d'abord ligne puis sautez 3 lignes et faites le reste – Saksow

Répondre

1

Vous pouvez utiliser

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

Voir la regex demo (utilisez le drapeau re.M avec re.findall).

Détails:

  • (?:AppearanceTime\s+|^\d+\s+) - cela correspond à 2 alternatives
    • - AppearanceTime cordes et 1+ (\s+ espaces blancs)
    • | - ou
    • ^\d+\s+ - début d'une ligne (^), 1+ (chiffres \d+) et 1+
    • espaces blancs
  • (\d{2}:\d{2}:\d{2}|\d{2}\.\d{3}) - allumettes et capture (la sortie finale pour re.findall) ou l'autre des 2 alternatives:
    • \d{2}:\d{2}:\d{2} - 3 : -Séparé 2 morceaux à chiffres
    • |
    • - ou
    • \d{2}\.\d{3} - 2 chiffres, ., 3 chiffres sous-chaîne

Voir la 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) 

sur:

['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'] 

il suffit d'utiliser le mode multiligne, apparaissent d'abord chaque match de ligne par ^\d^\d.+?.