2016-03-21 12 views
2

ile eşleşmiyor. Şu anda bir gözlem sitesi listesinden veri ayıklamak için bir kod parçası yazıyorum (bir örnek aşağıda verilmiştir). Şu anda aradığım veriyi içermeyen tüm satırları kaldırmak için normal ifadelerin bir listesi var. Normal ifadelerin tümü, tarihi arayanlar haricinde meta verilerin bulunduğu satırları başarılı bir şekilde gösterir. Regexr.com adresinden test edildiğinde, ifade düzgün çalışır, ancak kodu çalıştırırken satırları kaldıramıyorum. Tarih içeren satırları kaldırmak için ne eksik? veriTarih için düzenli ifade, python'un RE modülü

! 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

Örnek

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

Sadece bir not, regex'i bellet olmadan denedim, bunu göndermeden önce tire işaretinden kaçtı. Bu sadece internete yardım için başvurmadan önce denediğim son şey oldu. – Schmax

cevap

0

tarihiniz regex ilk "d" önce ters eğik eksik.

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

tarih ilk d önce \ eksik eşleştirme için

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

Çok teşekkür ederim! Bunu nasıl kaçırdığımı bilmiyorum! – Schmax

2

Sizin desen olmalıdır. Eğer bir dizenin başındaki eşleşmesi gerekmez re.search() kullandığımız için

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

: bunu değiştirin. Ayrıca, -'dan kurtulmanıza da gerek yoktur.

Desen belirtmek için ham bir dize (r öneki ile belirtilir) kullanın. Genellikle regex kalıpları için ham dizgiler kullanmalısınız, çünkü regex kalıpları olan bazı dizi çıkış dizileri vardır, örn. \b. Normal bir dize olarak bu, backspace karakterini temsil eder. Ham bir dizgede \, ardından b ve "bir sözcüğün başlangıcı veya bitişi" için regex modeli olarak değerlendirilir.

Belirtilmeye değer başka bir nokta, desenleri | ile birlikte birleştirerek, aynı anda birden fazla desen eşleşmesini kontrol edebilmenizdir. Bunu "veya" olarak düşün. Ardından kod daha öz yazılabilir:

regex deseni Derleme
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) 

re modül onları önbelleğe çünkü bunlardan sadece bir avuç vardır hiçbir yararı sağlar.