2

そこで、リアルタイムのNOAAPORTフィードからのデータを解析してSQLデータベースにスローするPythonパッケージを作成しています。正規表現に頭を巻くのに苦労しています。

私は特にLAT...LONラインと一致することを探しています:

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

そして私が思いつくことができる最高のものは:

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

しかし、LAT ... LONの後の2つの数字はすべて緯度と経度のポイントであり、次のポイントの行と一致させることができないようです。

また、これはオプションです。この竜巻警報の特定のセクションをグループ化したいと思います。WMOヘッダー「TORSJT」を分離したい(最初の3文字は勧告タイプで、最後の3文字は勧告を発行した気象局です。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

$$
4

3 に答える 3

2

正規表現の構造については他の人が説明していますが、re の使用方法にも注意する必要があります。テキストの大きなブロックを取得したい場合はre.findall、それがまだ複数行であり、(一致オブジェクトではなく) 文字列のリストを返すため、簡単に取得できます。明らかに、それはあなたが何をしたいかによって異なります。対照的に、re.match は行頭でのみ一致を検出します。

于 2012-04-09T04:40:44.523 に答える
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]

ライブ コンソール セッションで:

>>> 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']
>>>
于 2012-04-09T04:14:32.630 に答える