2016-09-01 7 views
1

正規表現を解析する2種類のデータを持つファイルがあります。しかし、データは十分に類似しているため、私はそれを区別する正しい方法を見つけることができません。私のファイルにPythonの正規表現に似た式

一部の行の形式は次のとおりです。

AED=FRI 
AFN=FRI:SAT 
AMD=SUN:SAT 

他の行は、フォーム

AED=20180823 
AMD=20150914 
AMD=20150921 

である残りの行はヘッダであり、私はそれらを破棄したいと思います。例えば

[HEADER: BUSINESS DATE=20160831] 

私のソリューションの試みはこれまでのところ、最初の3つの大文字と等号を一致させることです

r'\b[A-Z]{3}=\b' 

が、その後、私は、日付(例えば20180823)を区別するかどうかはわかりません日(例:金曜日:土曜日:日曜日)。私はこれらの解析機能から期待

結果:

Regex weekday_rx = new Regex(<EXPRESSION FOR TYPES LIKE AED=FRI>); 
Regex date_rx = new Regex(<EXPRESSION FOR TYPES LIKE AED=20160816>); 


weekdays = [weekday_rx.Match(line) for line in infile.read()] 
dates = [date_rx.Match(line) for line in infile.read()] 
+0

あなたはどんな結果が期待できますか? –

+0

ああ、確信してください –

+0

また、複数行の文字列(ファイル全体)を処理しているのか、行単位で読み込んでいますか? –

答えて

2
r'\S*\d$' 

が数字で終わるすべての非空白文字にマッチします

は一致しますAED=20180823

r'\S*[a-zA-Z]$' 

文字で終わる空白以外の文字とすべて一致します。

AED=AED=FRI AFN=FRI:SAT AMD=SUN:SAT

と一致しませんどちらもこれはあなたが期待出現箇所の数に*を置き換える両方

r'(\S*[a-zA-Z]$|\S*\d$)' 

と一致します

[HEADER: BUSINESS DATE=20160831]

と一致しますとなりますより安全、 (a|b)は、次のマッチAまたはマッチB

+0

ありがとう$最後に$は、行に含まれる文字数を使用することを意味しますか? –

+0

いいえ、それは終わりを意味します: "文字列の終わりに一致します" –

+0

あなたが投稿した最初の正規表現は "すべての繰り返しの大文字と一致し、文字列は数字で終わらなければなりません"と読みます。 –

2

あるPythonで溶液:)正規表現中の選択肢を表現する

import re 

p = re.compile(r'\b([A-Z]{3})=((\d)+|([A-Z])+)') 

str_test_01 = "AMD=SUN:SAT" 
m = p.search(str_test_01) 
print (m.group(1)) 
print (m.group(2)) 


str_test_02 = "AMD=20150921" 
m = p.search(str_test_02) 
print (m.group(1)) 
print (m.group(2)) 

""" 
<Output> 
AMD 
SUN 
AMD 
20150921 
""" 
+0

ありがとう、それを感謝します。 –

+0

私はそれが役に立つと願っています! –

2

使用パイプです。パターン[A-Z] {3}:[A-Z] {3} | [A-Z] {3} 'はABCとABC:ABCの両方に一致します。次に、括弧を使用して結果をグループ化します。

import re 

match = re.match(r'([A-Z]{3}:[A-Z]{3})|([A-Z]{3})', 'ABC:ABC') 
assert match.groups() == ('ABC:ABC', None) 

match = re.match(r'([A-Z]{3}:[A-Z]{3})|([A-Z]{3})', 'ABC') 
assert match.groups() == (None, 'ABC') 

名前付きグループの概念を調べると、これをさらに読みやすくすることができます。また、有用な情報やメソッドについては、マッチオブジェクトのドキュメントを見てください。

+0

ありがとう、代わりのアプローチのためにupvoting –