2009-08-17 13 views
0

私は必要な正規表現に問題があります。おそらく、私は 'lookaround'または条件式の組み合わせを使用する必要があると確信していますが、私は損失。python regex help:スキップするための不明な情報

は私のようなデータ列を有する:

Iデータで必要とされていない「パターン番号」と「オプション#」基の各々に対するマッチング式(基である任意の基を有していて
pattern1 pattern2 pattern3 unwanted-groups pattern4 random number of tokens pattern5 optional1 optional2 more unknown unwanted junk separated with white spaces optional3 optional4 etc 

したがって、常に存在するとは限りません)、すべての 'トークン'以外のセクションが空白で区切られている場合は、パターン(テキストは自由形式)またはスキップするグループ数はありません。

私は、必要なグループ間で不要なものをスキップする方法を見つけ出すことができましたが、オプションのグループに当たったとき、私は失われてしまいました。どのようなヒント/助けを求めているべきですか?

おかげ

が、これは私が現在持っているものです。

pattern = re.compile(r'(?:(METAR|SPECI)\s*)*(?P<ICAO>[\w]{4}\s)*' 
       r'(?P<NIL>(NIL)\s)*(?P<UTC>[\d]{6}Z\s)*(?P<AUTOCOR>(AUTO|COR)*\s)*' 
       r'(?P<WINDS>[\w]{5,6}G*[\d]{0,2}(MPS|KT|KMH)\s)\s*' 
       r'.*?\s' #skip miscellaneous between winds and thermal data 
       r'(?P<THERM>[\d]{2}/[\d]{2}\s)\s*(?P<PRESS>A[\d]{4}\s)\s*' 
       r'(?:RMK\s)\s*(?P<AUTO>AO\d\s)*' 
       r'(?P<PEAK>(PK\sWND\s[\d]{5,6}/[\d]{2,4}))*' 
       r'(?P<SLP>SLP[\d]{3}\s)*' 
       r'(?P<PRECIP>P[\d]{4}\s)*'   
       r'(?P<remains>.*)' 
       ) 

example = "METAR KCSM 162353Z AUTO 07011KT 10SM TS SCT100 28/19 A3000 RMK AO2 PK WND 06042/2325 WSHFT 2248 LTG DSNT ALQDS PRESRR SLP135 T02780189 10389 20272 53007=" 

data = pattern.match(example) 

最初の10グループのために働くように見えるが、それはそれについてです....再び

おかげで皆

+0

を、それはあなたがしていることは何ですか私はPythonに慣れていませんが、これは難しい正規表現の問題のようには見えません(regex1、field1などとは言わないでください)。 – Beta

+0

あなたは正しいです、field1はしかし、いいえ、私は知っているフィールドをキャプチャする必要があります。存在する場合、オプションのフィールドも格納する必要があります。 –

答えて

1

|演算子とfindallを使用する必要があります。

>>> re.compile("(regex\d+|optregex\d+)") 
>>> regex.findall(string) 
[u'regex1', u'regex2', u'regex3', u'regex4', u'regex5', u'optregex1', u'optregex2', u'optregex3', u'optregex4'] 

アドバイス:正規表現を試してみる(実際に書くのを助ける)いくつかのツール(GUI)があります。 Pythonの場合、私はkodosがかなり好きです。

+0

ありがとう、私はfindallコマンドで遊ぶ必要があります。それは私の問題を解決しますが、私はそのように速く解決策を見つけるかもしれません。 –

4

すべてのデータがその形式の場合は、代わりにsplitとします。私はそれがより速くなると思う。


str = "regex1 regex2 regex3 unwanted-regex regex4 random number of tokens regex5 optregex1 optregex2 more unknown unwanted junk separated with white spaces optregex3 optregex4 etc" 
parts = str.split() # now you have each part as an element of the array. 
for index,item in enumerate(parts): 
    if index == 3: 
     continue # this is unwanted-regex 
    else: 
     # do what you want with the information here 
+0

それは私の初期のアプローチでしたが、私のフィールドのいくつかは白スペースは、私はちょうどそのルートに行かなければならないかもしれないと言いました。 ありがとう –

+0

文字列の 'join'を使ってデータの一部をマージすることができます。 – Geo

+1

+1これは正規表現の問題ではありません。 – hughdbrown

0

あなたの目標の全てが「foo1の」のようなもので構成されている場合、「bar22」など(つまり数字の配列が続く文字の配列)、および他のすべて(数字の配列は、「言葉」数値サフィックスなどなし)「ジャンク」で、次は十分であると思わ:

re.findall(r'[A-Za-z]+\d+', targetstr) 

として(\マッチの数字と_(アンダースコアワットので、我々はちょうどR「\ W + \ dの+」を使用することはできません)よく手紙として)。

キーパターンの限られた数を探している、またはジャンクの一部が一致する可能性がある場合、「foo123 ...その後、あなたは明らかに、より具体的にする必要があります。

関連する問題