2016-12-15 6 views
1

Ich bin völlig verloren mit, wie man einen regulären Ausdruck passend konstruiert, um zu tun, was ich mit dieser Datei will.Regex oder 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 

ich sowohl die HH passen würde: unter der Spalte "Zeit" SS aus AppearanceTime und den SS.mss,: MM.

Zur Zeit kann ich es fast in zwei Schritten - zunächst für AppearanceTime ich verwenden kann:

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

Soweit ich mit den SS.mss Werte haben wird:

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

, aber dies entspricht einem Teil der Werte in AppearanceDate, Alpha, Delta, c_alpha und c_delta auch.

Schließlich, nur für den Fall, dass es darauf ankommt - ich habe hier getestet: https://regex101.com/ mit den globalen und mehrzeiligen Flags auf.

Wenn mir jemand damit helfen könnte, wäre es sehr geschätzt. Es scheint eine Menge guter Ressourcen zu geben, die bei der Erstellung von Regex helfen, aber ich komme absolut nirgendwohin! Ein anderer Gedanke, den ich hatte, war, dass ich wahrscheinlich split(' ') ziemlich effektiv für die SS.sss verwenden könnte, aber ich wollte fragen, ob irgendjemand eine Idee davon hat, welche von Regex oder Split effizienter ist, da dies auf viele Tausende angewendet wird Dateien wie die oben angegebene.

Vielen Dank!

+2

können Sie Textdaten in der Frage –

+0

senden Versuchen Sie wie dieses 'r"^AppearanceTime (. *) |^AppearanceDate (. *) "Gm' –

+0

Mein Rat ist Gebrauch' split ('') 'für beide zuerst Linie dann überspringe 3 Linien und mache den Rest – Saksow

Antwort

1

können Sie

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

die regex demo (verwenden Sie die re.M Flagge mit re.findall) nachschauen.

Einzelheiten:

  • (?:AppearanceTime\s+|^\d+\s+) - dies entspricht 2 Alternativen
    • - AppearanceTime Saiten und 1+ Whitespaces (\s+)
    • | - oder
    • ^\d+\s+ - Beginn einer Linie (^), 1+ Ziffern (\d+) und 1+ Whitespaces
  • (\d{2}:\d{2}:\d{2}|\d{2}\.\d{3}) - Spiele und fängt (die endgültige Ausgabe für re.findall) eine der zwei Alternativen:
    • \d{2}:\d{2}:\d{2} - 3 : -separated 2 -stellige chunks
    • | - oder
    • \d{2}\.\d{3}-2 Ziffern, ., 3 Ziffern Teilzeichen

Siehe 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) 

aus:

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

nur verwenden mehrzeiligen Modus, jede Zeile Spiel zuerst von ^\d^\d.+? erscheinen.