2016-05-04 67 views
1

値を抽出する必要がある文字列があります。問題は文字列が矛盾していることです。以下は、その中に文字列を持つスクリプトの例です。Python RegEx Stringデータの一貫性のない構文解析

import re 

RAW_Data = "Name Multiple Words Zero Row* (78.59/0) Name Multiple Words2* (96/24.56) Name Multiple Words3* (0/32.45) Name Multiple Words4* (96/12.58) Name Multiple Words5* (96/0) Name Multiple Words Zero Row6* (0) Name Multiple Words7* (96/95.57) Name Multiple Words Zero Row8* (0) Name Multiple Words9*" 

First_Num = re.findall(r'\((.*?)\/*', RAW_Data) 
Seg_Length = re.findall(r'\/(.*?)\)', RAW_Data) 
#WithinParenthesis = re.findall(r'\((.*?)\)', RAW_Data) #This works correctly 

print First_Num 
print Seg_Length 

del RAW_Data 

文字列から抜け出すために必要なものはすべて括弧内の値です。しかし、数字の間に "/"がないことを処理するロジックが必要です。基本的に "/"が存在しない場合は、First_NumとSeg_Lengthの両方の値を "0"にします。私はこれが理にかなってほしい。

答えて

1

は、単純な正規表現を使用して、いくつかのプログラミングロジックを追加します。

import re 
rx = r'\(([^)]+)\)' 
string = """Name Multiple Words Zero Row* (78.59/0) Name Multiple Words2* (96/24.56) Name Multiple Words3* (0/32.45) Name Multiple Words4* (96/12.58) Name Multiple Words5* (96/0) Name Multiple Words Zero Row6* (0) Name Multiple Words7* (96/95.57) Name Multiple Words Zero Row8* (0) Name Multiple Words9*""" 

for match in re.finditer(rx, string): 
    parts = match.group(1).split('/') 
    First_Num = parts[0] 
    try: 
     Seg_Length = parts[1] 
    except IndexError: 
     Seg_Length = None 

    print "First_Num, Seg_Length: ", First_Num, Seg_Length 

あなたが(例えば、条件付き正規表現で)正規表現だけでは解決策と仲良くかもしれないが、このアプローチは、まだ3ヶ月で理解される可能性があります。デモをideone.comでご覧ください。

+1

これは1月に動作するように見えます。いくつかのサンプルデータでそれを実行しました。驚くばかり!ありがとう – user1457123

+0

@ user1457123:喜んで助けてください:) – Jan

+0

1月、ネストされたループ内でこれをどのように実行できるかに関する提案はありますか?私が試してみると、First_NumとSeg_Lengthだけの最後の値が得られます。多分私はこれについて新しい質問を投稿すべきでしょうか? – user1457123

0

'/'の両側に値がありません。存在しないことがわかっています。あなたの最初の検索のために常に知られている状態に戻ります。括弧内のすべてのデータを検索するには、正規表現を使用します。次に、 '/'が値にあるかどうかに基づいてこれらを処理します。

関連する問題