2016-10-18 10 views
0

text変数によって説明した3つの日があります。複数のフィルタとREGEXを使用する方法

text = """ 
DAY { 
foo 12 5 A 
foo 
12345 
} 
DAY { 
day 1 
day 2 
file = "/Users/Shared/docs/doc.txt" 
day 3 
end of the month 
} 
DAY { 
01.03.2016 11:15 
01.03.2016 11:16 
01.03.2016 11:17 
}""" 

全3日間の定義は(行の先頭にある)ワードDAYで始まり、その後、スペースや中括弧は、 。終わりは、常に行の先頭に配置された閉じ括弧で示されます。 したがって、各DAYの境界は中括弧{}内に定義されています。

使用regex 私は境界線の内側にfile = "/Users/Shared/docs/doc.txt"行を含むDAYを「見つける」必要があります。

私は正規表現式を書き始めた:

string = """DAY {\n [A-Za-z0-9]+}"""

result = re.findall(string, text)

しかし、式は、右の空白文字の前にfooの最後にテキストの検索を停止します。それは、その本体でfile = "/Users/Shared/docs/doc.txt"を有する第2 DAYを返すので、結果は次のようになりますように、式を変更する方法:複数行のテキストに一致する正規表現を実行するには

DAY { 
day 1 
day 2 
file = "/Users/Shared/docs/doc.txt" 
day 3 
end of the month 
} 

答えて

1

、あなたはパラメータre.MULTILINEであなたの正規表現をコンパイルする必要があります。

このコードは、要求どおりに動作するはずです。

regex = re.compile("""(DAY\s*\{[^\{\}]*file\ \=\ \"/Users/Shared/docs/doc\.txt\"[^\{\}]*\})""", re.MULTILINE) 
regex.findall(text) 

結果:

['DAY {\n day 1\n day 2\n file = "/Users/Shared/docs/doc.txt"\n day 3\n end of the month\n}'] 
関連する問題