2012-02-29 3 views
2

.txtファイル内のすべての関数を解析する必要があります。それは次のようになります。正規表現を使用してPythonの2つの文字列間を移動する

def 
    test 
end 

def 
    hello 
end 

def 
    world 
end 

だから、私はなるだろう返さ以下:[test, hello, world]ここ

は、私が試したものですが、私は戻って何かを得ることはありません:

r = re.findall('def(.*?)end', doc) 
    print r 

答えて

4

.が改行にも一致するようにするre.DOTALLフラグを使用する必要があります(docは複数行です)。

外側のデフ/エンドブロック(インデントされているものを無視する)だ​​けが必要な場合は、さらに正規表現内で '^ def'と '^ end'を使用できます。この場合、re.MULTILINEフラグ、 '^'と '$'はの開始/終了に一致します(開始/終了はの文字列とは異なります)。

re.findall('^def(.*?)^end',doc,re.DOTALL|re.MULTILINE) 
+0

これからどうすればいいですか?doc = "{'content': 'LAND.L'、 'href'"式 'LAND.L'?私は試しました: "'content' :(。*?)、\ b'href '"ですが、うまくいきませんでした。ありがとう! –

+0

をre.findall( "[^ \ '] content [^ \'] :(。*?)[^ \ '] href [^ \']"、a)に修正しましたが、それでも動作しません。 aを返します。 –

+0

どのように単語全体から得ることができますか?例えば、 "私のタイトル"と "私の終わり"の間に通路を得る。ありがとう –

0

あなたが必要re.MULTILINEフラグを1つの正規表現内の複数の行に一致させることができます。 また、^$が行うませマッチ改行(\n

>>> re.findall(r"^def$\n(.*)\n^end$", doc, re.MULTILINE) 
[' test', ' hello', ' world'] 

あなたはブロックの先頭にある空白文字と一致しない場合、\W+追加:

>>> re.findall(r"^def$\n\W*(.*)\n^end$", text, re.MULTILINE) 
['test', 'hello', 'world'] 
+0

re.MULTILINEは、文字列演算子ではなく、行ごとに '^'と '$'を変換します。これは、複数行の入力の場合(複数行の正規表現ではなく)は役に立ちません。 –

2
r = re.findall('def(.*?)end', doc, re.S) 
関連する問題