2016-09-04 10 views
1

Pythonでregexを使って文字列内の一致する文字列を検索しようとしています。 stringは次のようになります。python regex一致する文字列を見つける

band 1 # energy -53.15719532 # occ. 2.00000000 

ion  s  p  d tot 
    1 0.000 0.995 0.000 0.995 
    2 0.000 0.000 0.000 0.000 
tot 0.000 0.996 0.000 0.996 

band 2 # energy -53.15719532 # occ. 2.00000000 

ion  s  p  d tot 
    1 0.000 0.995 0.000 0.995 
    2 0.000 0.000 0.000 0.000 
tot 0.000 0.996 0.000 0.996 

band 3 # energy -53.15719532 # occ. 2.00000000 

私の目標は、tot後の文字列を見つけることです。だから、マッチした文字列は次のようになります。ここでは

['0.000 0.996 0.000 0.996', 
'0.000 0.996 0.000 0.996'] 

私の現在のコードです:

pattern = re.compile(r'tot\s+(.*?)\n', re.DOTALL) 
pattern.findall(string) 

ただし、出力は私を与える:

['1 0.000 0.995 0.000 0.995', 
'0.000 0.996 0.000 0.996', 
'1 0.000 0.995 0.000 0.995', 
'0.000 0.996 0.000 0.996'] 

私がやっているものの任意のアイデアを違う?

答えて

4

DOTALLフラグは不要です。それを削除し、代わりにMULTILINEを使用してください。

pattern = re.compile(r'^\s*tot(.*)', re.MULTILINE) 

これは、totで始まるすべての行に一致します。 改行含む'.'特殊文字がすべてで任意の文字に一致させる

re.DOTALL

:行の残りの部分はdocumentation、重点鉱山を引用グループに1

になります;このフラグがなければ、'.'は、改行である 以外のものと一致します。

正規表現なしで簡単に行うことができます。

with open("input.txt", "r") as data_file: 
    for line in data_file: 
     items = filter(None, line.split(" ")) 
     if items[0] == "tot": 
      # etc 
+0

これは私の問題を解決します。私は 'DOTALL'と' MUTILINE'について混乱していると思う。それについてもっと読む必要があります。 –

1

re.DOTALLを使用しています。つまり、ドット "。"が使用されています。 re.DOTALLはあなたの問題を解決する必要があります削除

      tot 
    1 0.000 0.995 0.000 0.995 

tot 0.000 0.996 0.000 0.996 

:「TOT」-sと次の改行まで、以下のすべてのものの両方を見つける本質的には、何も改行にマッチします。

編集: 実際には、DOTALLフラグは実際問題ではありません(不要ですが)。このパターンの問題は、\ s +が改行にマッチすることです。単一のスペースであることを交換すると、その問題を解決します

pattern = re.compile(r'tot (.*?)\n') 
+0

@Tomalakは –

+0

のように 'DOTALL'を' MULTILINE'に変更すべきだと思います。^と$を使って行の先頭と末尾を一致させたくない場合は、MULTILINEは必要ありません。私は@トマラクの解決策がよりクリーンであることを指摘しなければならない。 – mpurg

+0

あなたはそうです。 '\ s +'は実際にはここでの問題です。私は1つ以上の空白を意味しますが。知らせてくれてありがとうございます。 –

1

代替ソリューションを、特定の正規表現パターンでre.findall機能を使用して:

# str is your inital string 
result = re.findall('tot [0-9 .]+(?=\n|$)', str) 
print(result) 

出力:

['tot 0.000 0.996 0.000 0.996', 'tot 0.000 0.996 0.000 0.996'] 
関連する問題