2016-07-05 4 views
4

テキストファイルからデータを抽出しようとしています。 Jon 2013 transの35行目のexの場合(P) '私は(35、2013、(P))を抽出しようとしています。Python Regexのヘルプが必要です

この35は文書番号であり、2015は文書年であり、(P)は優先文書を示す。

文書番号には文書年が続き、文書の優先順位が高い場合は、最後に(P)が付きます。

文書の優先度が高くなく、最後に(P)が含まれていない可能性があります。 ex-'31 of Sansa 2014 filled ' これは私が抽出したい(31,2014、' ')

私は文書の情報を含む文字列を持っています。問題は、文字列が連結され、単一の文字列に複数のドキュメントの情報があることです。

line = '35 of Jon 2013 trans。 (P)3130のArya 2014空325が封印されたSansa 2014の3132封印、(P) '

私は以下のコードを書いていますが、正しく機能しません。

rgx = r'(\d{1,9})\s* OF \s*[A-Za-z]+\s*([1,2]\d{3}).*?(\(P\))?' 
rgx2 = r'(\d{1,9})\s* OF \s*[A-Za-z]+\s*([1,2]\d{3}).*?(\(P\))' 
line = '35 of Jon 2013 trans. (P) 31 of Sansa 2014 filled 3232 of Arya 2014 empty 345 of Bran 2011 sealed, (P)' 

x = re.findall(rgx, line, re.IGNORECASE) 
for i in x: 
    print i 
print 'Output by rgx2' 
x = re.findall(rgx2, line, re.IGNORECASE) 
for i in x: 
    print i 

このコードによって生成される出力: - 最初の正規表現は正しくドキュメントIDとドキュメント年をキャッチすることができますが、それは(P)を抽出するために失敗したものの

('35', '2013', '') 
('31', '2014', '') 
('3232', '2014', '') 
('345', '2011', '') 
Output by rgx2 
('35', '2013', '(P)') 
('31', '2014', '(P)') 

私が使用しているようなタイプ「( P)? 2番目の正規表現の問題は、P型を見つけるために "。*?(P)"を使用しているため、間違ったデータになります。

私が欲しい正しいデータ出力は、誰もがより良い正規表現を提案することができます

('35', '2013', '(P)') 
('31', '2014', '') 
('3232', '2014', '') 
('345', '2011', '(P)') 

です。 助けてください!

+0

元のファイルとどのようにあなたがそれを読み込むのサンプルを投稿してください。あなたの質問は、文字列ではなくテキストファイルから情報を処理することに関する名目上のものです。 –

答えて

3

あなたがそれをしたいので、これは動作します:

import re 

reg = r'(\d+)[^\d]*(\d+)[^\d|\(]*(\(P\))*' 
line = '35 of Jon 2013 trans. (P) 31 of Sansa 2014 filled 3232 of Arya 2014 empty 345 of Bran 2011 sealed, (P)' 

print 'Output by reg'  
for _ in re.findall(reg, line, re.IGNORECASE): 
    print _ 
+1

'[^ \ d | \(]'の中にパイプ文字を使用する特定の理由はありますか? –

+0

あなたは正しいと思いますが、この場合はオプションですが、読みやすくなります。 – Ohumeronen

+0

これは無視されませんが、リテラルパイプ文字として扱われ、一致する文字のリストから除外されます。文字クラス内で明示的にパイプを使用する理由がない場合は、 –

2

は、この正規表現を試してみてください:

(\d+) of [a-zA-Z]+ (\d+) [a-zA-Z.]+(?:[,]? (\(P\)))? 
関連する問題