2017-09-01 3 views
0

そこには、正規表現で奇妙な「貪欲」の動作は以下のとおりです。私の検索パターンで :作るre.Sで残りの部分が収まりきらず、最初の部分の次のマッチの後でのみ適合する場合、最初の部分の正規表現をどうやって作るのですか?

r'\/begin FUNC\s+(\w*).*?\/begin DEF_VAR\s*([\w .\s]*)\s*\/end DEF_VAR.*?\/end FUNC' 

「」改行を合わせる。そして、テスト文字列ビーイング:

/begin FUNC 
    WDHOL 

/end FUNC 

/begin FUNC 
    AMROTL 
    /begin DEF_VAR 
     KFMELO 
    /end DEF_VAR 
/end FUNC 

試合ではなく、予想される[ 'KFMELO \ nは\ T' 'AMROTL']の[ 'WDHOL'、 'KFMELO \ nは\ T']を返します。 最初の部分が再び来るとき(または '/ end FUNC'のとき)、regexpは最初の部分の試合をやめることができますか? 私は否定的な先取りを試みたが、役に立たなかった。試合はまったく何も返されないか、同じ結果とだけ時間がかかった...

+0

'' 'ちょうどWDHOL'を'得る。*? 'マッチ' /終了FUNC (\ * w)は/ FUNC AMROTL '、奇妙な何を始めます。 – Cheney

答えて

1

あなたは否定先読み使用することができます。

s = '''/begin FUNC 
    WDHOL 

/end FUNC 

/begin FUNC 
    AMROTL 
    /begin DEF_VAR 
     KFMELO 
    /end DEF_VAR 
/end FUNC''' 

pat = re.compile(r'(?:\/begin FUNC)\s+(\w*)(?!.*?\1)\s+\/begin DEF_VAR\s*([\w .\s]*)\s*\/end DEF_VAR.*?\/end FUNC', re.S) 

pat.findall(s) 

出力:

[('AMROTL', 'KFMELO\n ')]

+0

ありがとうございます。これは、複数の単語が/ DEF_VARにカプセル化されているという拡張されたケースでも機能します。 DEF_VAR \ s *([\ w。\ s] *)\ s * \を開始することもできました。 /終了DEF_VAR。*?\/end FUNC '。あなたの助けをありがとう! – mrCarnivore

1

は、次のアプローチを使用します。

s = ''' 
/begin FUNC 
    WDHOL 

/end FUNC 

/begin FUNC 
    AMROTL 
    /begin DEF_VAR 
     KFMELO 
    /end DEF_VAR 
/end FUNC''' 

pat = re.compile('/begin FUNC\s*(\S+)\s*/begin DEF_VAR\s*(\S+)\s*/end DEF_VAR\s*/end FUNC') 
result = pat.findall(s, re.DOTALL) 
print(result) 

出力を:

[('AMROTL', 'KFMELO')] 
+0

ありがとうございます。これは私の単純化されたケースでは機能します。しかし、実際のケースでは(私が間違って指定したわけではありませんが)、DEF_VARに/に囲まれた単語が複数あります。しかし、私は簡単にそれを適応させることができます: '/ begin FUNC \ s *(\ S *)\ s */begin DEF_VAR \ s *(\ w。*)\ s */end DEF_VAR \ s */end FUNC'。だから助けてくれてありがとう! – mrCarnivore

関連する問題