2016-03-21 9 views
2

Ich schreibe gerade ein Stück Code, um Daten aus einer Liste von Beobachtungssites zu extrahieren (ein Beispiel ist unten angegeben). Ich habe derzeit eine Liste von regulären Ausdrücken, um Zeilen zu entfernen, die keine Daten enthalten, nach denen ich suche. Alle regulären Ausdrücke geben die Zeilen an, in denen die Metadaten enthalten sind, mit Ausnahme der Zeile, die nach dem Datum sucht. Bei einem Test auf regexr.com funktioniert der Ausdruck einwandfrei, aber beim Ausführen von Code kann ich die Zeilen nicht entfernen. Was fehlt mir, um die Zeilen mit den Daten zu entfernen?Regulärer Ausdruck für Datum passt nicht in Pythons RE-Modul

Beispiel für Daten

! CD = 2 letter state (province) abbreviation 
! STATION = 16 character station long name 
! ICAO = 4-character international id 
! IATA = 3-character (FAA) id 
! SYNOP = 5-digit international synoptic number 
! LAT = Latitude (degrees minutes) 
! LON = Longitude (degree minutes) 
! ELEV = Station elevation (meters) 
! M = METAR reporting station. Also Z=obsolete? site 
! N = NEXRAD (WSR-88D) Radar site 
! V = Aviation-specific flag (V=AIRMET/SIGMET end point, A=ARTCC T=TAF U=T+V) 
! U = Upper air (rawinsonde=X) or Wind Profiler (W) site 
! A = Auto (A=ASOS, W=AWOS, M=Meso, H=Human, G=Augmented) (H/G not yet impl.) 
! C = Office type F=WFO/R=RFC/C=NCEP Center 
! Digit that follows is a priority for plotting (0=highest) 
! Country code (2-char) is last column 
! 
!23456789
! 

ALASKA    16-DEC-13 
CD STATION   ICAO IATA SYNOP LAT  LONG ELEV M N V U A C 
AK ADAK NAS   PADK ADK 70454 51 53N 176 39W 4 X  T   7                         US 
AK AKHIOK   PAKH AKK   56 56N 154 11W 14 X    8                         US 
AK AMBLER   PAFM AFM   67 06N 157 51W 88 X    7                         US 
AK ANAKTUVUK PASS PAKP AKP   68 08N 151 44W 642 X    7                         US 
AK ANCHORAGE INTL PANC ANC 70273 61 10N 150 01W 38 X  T X A 5                         US 
AK ANCHORAGE/WFO PAFC AFC   61 10N 150 02W 48     F 8                         US 
AK ANCHORAG/NIKISKI PAHG AHG   60 44N 151 21W 74  X    8                         US 
AK ANCHORAGE/LAKE H PALH LHD   61 11N 149 58W 22 X   A 7                         US 
AK ANCHORAGE/ARTCC PZAN ZAN   61 10N 149 59W 22   A   8                         US 
AK ANCHORAGE/MERRIL PAMR MRI   61 13N 149 51W 41 X   A 7                         US 
AK ANGOON SEAPLANE PAGN    57 30N 134 35W 2 X    8                         US 
AK ANIAK   PANI ANI 70232 61 35N 159 32W 26 X    7                         US 
AK ANNETTE ISLAND PANT ANN 70398 55 02N 131 34W 36 X  X A 5                         US 
AK ANVIK   PANV ANV   62 39N 160 11W 99 X    7                         US 
AK ARCTIC VILLAGE PARC ARC   68 07N 145 35W 636 X    7                         US 
AK ATQASUK BURNELL PATQ ATK   70 28N 157 26W 29 X    7                         US 
AK ATKA    PAAK AKA   52 13N 174 12W 17 X    7                         US 
AK BARROW   PABR BRW 70026 71 17N 156 48W 7 X  T X A 5                         US 
AK BARROW ARM-NSA    70027 71 19N 156 37W 7   X  8                         US 
AK BARTER ISLAND PABA BTI 70086 70 08N 143 35W 2 X   W 7                         US 
AK BETHEL   PABE BET 70219 60 47N 161 51W 41 X  T X A 5                         US 
AK BETHEL/88D  PABC ABC   60 48N 161 53W 49  X    8                         US 
AK BETTLES   PABT BTT 70174 66 55N 151 31W 195 X  T  A 6                         US 
AK BIG RIVER LAKES PALV LVR   60 49N 152 18W 12 X    7                         US 
AK BIRCHWOOD  PABV BCV   61 25N 149 31W 29 X    7                         US 
AK BREVIG_MISSION PFKT    65 20N 166 28W 9 X    7                         US 
AK BUCKLAND   PABL BVK   65 59N 161 09W 7 X    7                         US 
AK CANTWELL   PATW TTW   63 23N 148 57W 668 X    7                         US 
AK CAPE LISBURNE PALU LUR 70104 68 53N 166 08W 3 X  T  W 6                         US 
AK CAPE NEWENHAM PAEH EHM 70305 58 39N 162 04W 161 X  T   6                         US 
AK CAPE ROMANZOF PACZ CZF 70212 61 47N 166 02W 146 X  T   6                         US 
AK CENTRAL   PARL    65 34N 144 47W 284 X    7                         US 
AK CENTRAL   PACE    65 34N 144 47W 286 X    7                         US 
AK CENTRAL AK PROF  CEN 70197 65 30N 144 41W 259   W  8                         US 
AK CHANDALAR LAKE PALR WCR   67 30N 148 29W 585 X    7                         US 
AK CHEVAK   PAVA    61 32N 165 36W 23 X    7                         US 
AK CHIGNIK BAY  PAJC AJC   56 19N 158 22W 15 X    7                         US 
AK CIRCLE/PAFC RFC PACR CRC   65 50N 144 04W 182 X    R 7                         US 
AK COLD BAY   PACD CDB 70316 55 12N 162 43W 30 X  T X A 5                         US 
AK CORDOVA   PACV CDV 70296 60 30N 145 30W 12 X  T  A 6                         US 
AK DEADHORSE  PASC SCC   70 12N 148 28W 15 X  T  A 6                         US 
AK DEERING   PADE DEE   66 04N 162 46W 5 X   A 7                         US 
AK DELTA JUNCTION PABI BIG 70267 64 00N 145 44W 386 X  T  A 6                         US 

My-Code

station_file = open('../DATA/stations.txt', 'r') 
data = station_file.read() 

skip_res = ['^$', '^.*d{2}\-[A-Z]{3}\-\d{2}','^!'] #List of regular expressions which only appear in lines of metadata (not actual data) 

data = data.split('\n') 

for loop in data: 
    breakcheck = False # In the event a regular expression matches, this will turn to true and skip that line 
    for check in skip_res: 
     current = re.compile(check) 
     if current.search(loop) == None: 
      continue 
     else: 
      breakcheck = True 
      break 
    if breakcheck: 
     continue 
    else: 
     print(loop) # Should only print out lines containing actual data. 
+0

Nur eine Anmerkung, ich versuchte die Regex ohne den Caret, entkam Bindestrich alle vor dem Posten dieses. Dies war nur das letzte, was ich ausprobiert habe, bevor ich das Internet um Hilfe gebeten habe. – Schmax

Antwort

0

Ihr Datum regex einen umgekehrten Schrägstrich vor dem ersten "d" fehlt.

'^.*d{2}\-[A-Z]{3}\-\d{2}' 

sollte

'^.*\d{2}\-[A-Z]{3}\-\d{2}' 
+1

Vielen Dank! Nicht sicher, wie ich das verpasst habe! – Schmax

2

Ihr Muster sein für die Anpassung wird das Datum ein \ vor dem ersten d fehlt. Ändern Sie ihn auf:

r'\d{2}-[A-Z]{3}-\d{2}' 

Da Sie re.search() verwenden Sie müssen nicht von Anfang an der Zeichenfolge übereinstimmen. Außerdem müssen Sie nicht der - entkommen.

Beachten Sie die Verwendung einer Raw-Zeichenfolge (mit dem Präfix r bezeichnet), um das Muster anzugeben. Im Allgemeinen sollten Sie Raw-Strings für Regex-Muster verwenden, da es einige String-Escape-Sequenzen gibt, die ebenfalls Regex-Muster sind, z. \b. Als normale Zeichenfolge repräsentiert dies das Backspace-Zeichen. In einer rohen Zeichenkette wird sie als \ behandelt, gefolgt von b, was das Regex-Muster für "Anfang oder Ende eines Wortes" ist.

Eine andere Sache, die erwähnenswert ist, ist, dass Sie nach einer Übereinstimmung von mehr als einem Muster zu einer Zeit überprüfen können, indem Sie die Muster zusammen mit | verbinden. Betrachten Sie es als "oder". Dann können Sie den Code prägnant geschrieben mehr werden:

skip_res = [r'^$', r'\d{2}-[A-Z]{3}-\d{2}',r'^!'] 
skip_pattern = r'|'.join(skip_res) 

with open ('../DATA/stations.txt', 'r') as station_file: 
    for line in station_file: 
     if re.search(skip_pattern, line): 
      continue 
     print(line) 

Kompilieren des RegexMuster bietet keinen Vorteil, wenn es nur eine Handvoll von ihnen, weil das re Modul sie zwischengespeichert werden.