2016-08-02 30 views
3

は、我々は、私が文字>と文字列「テスト」の間の文字列を取得する必要があり、文字列マルチライン文字列で特定の文字と文字列の間で文字列をキャプチャするにはどうすればよいですか? Pythonの

string="This is a test code [asdf -wer -a2 asdf] >(ascd asdfas -were)\ 

test \ 

(testing test) test >asdf \ 

     test" 

があるとしましょう。

私は必要しかし、私は

(ascd asdfas -were)\ test \ (testing test) test >asdf. 

を取得しかし、私は

re.findall(r'>[^)](.*)test',string, re.MULTILINE) 

を試してみました:

(ascd asdfas -were)\ 

asdf 

どうすればそれらの2文字列を取得できますか?

+0

コードブロックを修正しようとしましたが、意図したとおりにコードブロックを確認できますか? – jedwards

+0

ありがとうございます。これは私が欲しかったものです – Sam

+1

ここで素晴らしい正規表現の作成者は、https://regex101.com/#pythonをテストするのに役立ちます – ti7

答えて

2

何について:

import re 

s="""This is a test code [asdf -wer -a2 asdf] >(ascd asdfas -were) 
test 
(testing test) test >asdf 
test""" 

print(re.findall(r'>(.*?)\btest\b', s, re.DOTALL)) 

出力:このパターンの

['(ascd asdfas -were)\n', 'asdf\n'] 

ザ・幾分興味深い部分は、以下のとおりです。?.*は "ungreedy" になり

  • .*?、それ以外の場合は、2つではなく1つの長い一致があります。
  • testの代わりに\btest\bを「終了」識別子(下記のJanのコメントを参照)として使用します。 Where、 は

    \b は、単語の先頭や末尾に限る、空の文字列にマッチします....

注意を私が考えるほど、それは、re.DOTALL上に読んですることができますそれはです。実際にはです。 DOTALLMULTILINEは、アンカー(^,$)が文字列全体ではなく行の先頭と末尾に一致するようにしながら、.文字に改行を含めます。あなたがアンカーを使わないことを考えれば、私はDOTALLがより適切だと思っています。

+1

ありがとうございます。これはまさに私が探していたものです。私は説明にも感謝します。私が許されるとすぐに私はこの回答を受け入れます。 – Sam

+1

これは、 'tester'、' testerfield'、 'testman'(あなたはアイデアを得る)の' test'にもマッチします: '\ btest \ b'という単語境界も同様に適用されます。 – Jan

+0

@ヤン、いいアイデアだ、それを編集するだろう。 – jedwards

関連する問題