2012-04-09 3 views
2

그래서 실시간 NOAAPORT 피드의 데이터를 구문 분석하여 SQL 데이터베이스에 던질 Python 패키지를 작성합니다. RegEx에서 머리를 감싸는 데 어려움을 겪고 있습니다.RegEx를 사용하여 NOAAPORT 피드를 구문 분석

나는 특히 LAT ... LON 라인에 맞게 찾고 있어요 :

LAT...LON 3153 10127 3153 10118 3152 10118 3142 10122 
     3141 10127 3152 10127 

내가 가지고 올 수있는 최선의 것은 :

r'^LAT...LON(.*)' 

그러나 모든 두 숫자 LAT 후. ..LON은 위도와 경도 점이며 다음 점의 점과 일치시킬 수 없습니다.

또한 이것은 선택 사항입니다.이 토네이도 경고의 특정 섹션을 분류하고 싶습니다. WMO 헤더 "TORSJT"를 구분하고 싶습니다. (처음 세 글자는 자문 유형이고 마지막 세 글자는 자문 유형입니다.) TOR = 토네이도 경고 SJT = 샌 앤젤로, 텍사스 날씨 사무소

그런 다음 경고 텍스트를 구분하기 만하면됩니다.

BULLETIN - EAS ACTIVATION REQUESTED 
TORNADO WARNING 
NATIONAL WEATHER SERVICE SAN ANGELO TX 
802 PM CDT SAT APR 7 2012 

THE NATIONAL WEATHER SERVICE IN SAN ANGELO HAS ISSUED A 

* TORNADO WARNING FOR... 
    NORTHWESTERN IRION COUNTY IN WEST CENTRAL TEXAS... 

* UNTIL 815 PM CDT 

* AT 757 PM CDT...A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A 
    TORNADO WAS OVER EXTREME NORTHWESTERN IRION COUNTY...OR 24 MILES 
    NORTHEAST OF BIG LAKE...MOVING SOUTH SOUTHWEST AT 15 MPH. THIS 
    STORM HAS A HISTORY OF PRODUCING A TORNADO AND MAY PRODUCE A 
    TORNADO AT ANY TIME. 

    IN ADDITION TO DANGEROUS TORNADIC WINDS...OTHER HAZARDS INCLUDE... 
    LARGE DAMAGING HAIL UP TO TENNIS BALL SIZE. 
    DAMAGING STRAIGHT LINE WINDS IN EXCESS OF 60 MPH. 
    POTENTIALLY DEADLY LIGHTNING. 

*THE TORNADO WILL REMAIN OVER MAINLY RURAL AREAS OF... 
    NORTHWESTERN IRION COUNTY. 

PRECAUTIONARY/PREPAREDNESS ACTIONS... 

A SEVERE THUNDERSTORM WATCH REMAINS IN EFFECT UNTIL 1000 PM CDT 
SATURDAY EVENING FOR WEST CENTRAL TEXAS. 

&& 

기본적으로 모든 항목을 사전에 배치하고 3 가지 항목 모두 자체 키를 가져와야합니다.

368 
WFUS54 KSJT 080102 
TORSJT 
TXC235-080115- 
/O.NEW.KSJT.TO.W.0012.120408T0102Z-120408T0115Z/ 

BULLETIN - EAS ACTIVATION REQUESTED 
TORNADO WARNING 
NATIONAL WEATHER SERVICE SAN ANGELO TX 
802 PM CDT SAT APR 7 2012 

THE NATIONAL WEATHER SERVICE IN SAN ANGELO HAS ISSUED A 

* TORNADO WARNING FOR... 
    NORTHWESTERN IRION COUNTY IN WEST CENTRAL TEXAS... 

* UNTIL 815 PM CDT 

* AT 757 PM CDT...A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A 
    TORNADO WAS OVER EXTREME NORTHWESTERN IRION COUNTY...OR 24 MILES 
    NORTHEAST OF BIG LAKE...MOVING SOUTH SOUTHWEST AT 15 MPH. THIS 
    STORM HAS A HISTORY OF PRODUCING A TORNADO AND MAY PRODUCE A 
    TORNADO AT ANY TIME. 

    IN ADDITION TO DANGEROUS TORNADIC WINDS...OTHER HAZARDS INCLUDE... 
    LARGE DAMAGING HAIL UP TO TENNIS BALL SIZE. 
    DAMAGING STRAIGHT LINE WINDS IN EXCESS OF 60 MPH. 
    POTENTIALLY DEADLY LIGHTNING. 

*THE TORNADO WILL REMAIN OVER MAINLY RURAL AREAS OF... 
    NORTHWESTERN IRION COUNTY. 

PRECAUTIONARY/PREPAREDNESS ACTIONS... 

A SEVERE THUNDERSTORM WATCH REMAINS IN EFFECT UNTIL 1000 PM CDT 
SATURDAY EVENING FOR WEST CENTRAL TEXAS. 

&& 

LAT...LON 3153 10127 3153 10118 3152 10118 3142 10122 
     3141 10127 3152 10127 
TIME...MOT...LOC 0102Z 355DEG 11KT 3148 10125 

$$ 
+1

NOAAPORT 피드를 얻는 것을 좋아합니다. 나에게 묻지 않을 경우 어디에서 가져 오는거야? – ONDEV

답변

2

당신은 기본적으로 멀티 라인 정규식 매칭을 수행하려는 :

여기 참조를 위해 그대로 경고 전체입니다.

대신 욕심 일치, .*를 사용하는 같은 것을 사용해보십시오 : 라이브 콘솔 세션에서

import re 

regex = re.compile('LAT...LON([0-9\s]+)', flags=re.MULTILINE) 
matches = regex.search('''LAT...LON 3153 10127 3153 10118 3152 10118 3142 10122 
     3141 10127 3152 10127 
TIME...MOT...LOC 0102Z 355DEG 11KT 3148 10125''') 
print re.split('\s+', matches.group(1))[1:-1] 

을 다음 DOTALL 플래그가 아닌

>>> import re 
>>> 
>>> regex = re.compile('LAT...LON([0-9\s]+)', flags=re.MULTILINE) 
>>> matches = regex.search('''LAT...LON 3153 10127 3153 10118 3152 10118 3142 10122 
...  3141 10127 3152 10127 
... TIME...MOT...LOC 0102Z 355DEG 11KT 3148 10125''') 
>>> print re.split('\s+', matches.group(1))[1:-1] 
['3153', '10127', '3153', '10118', '3152', '10118', '3142', '10122', '3141', '10127', '3152', '10127'] 
>>> 
1

. 개행 이외의 모든 일치 지정된.
그래서 단지 \n에 추가 한 다음 다른 .* :

import re 

test = '''LAT...LON 3153 10127 3153 10118 3152 10118 3142 10122 
     3141 10127 3152 10127 
TIME...MOT...LOC 0102Z 355DEG 11KT 3148 10125''' 

result = re.search(r'LAT...LON.*\n.*', test) 

print result.group() 

또는

result = re.search(r'LAT...LON[\d\s]+\n[\d\s]+', test) 
2

기타 정규식 건설을 포함,하지만 당신은 또한 당신이 재를 사용하는 방법에 대한주의해야합니다. 큰 블록의 텍스트를 가져 오려면 re.findall이 더 쉬울 수 있습니다. 여전히 다중 행이어서 일치하는 객체 대신 문자열 목록을 반환하기 때문입니다. 분명히 그것은 당신이하고 싶은 것에 달려 있습니다. 대조적으로, re.match 은 행의 시작 부분에서 일치하는 것을 찾습니다.

관련 문제