2009-06-05 15 views
2

タグ内のすべてとその次の行をキャプチャすると仮定しますが、次回ブラケットを満たしたときに停止すると仮定します。何が間違っているのですか?取得しようとして何イムPythonの正規表現が正しく再帰しない

import re #regex 

regex = re.compile(r""" 
     ^     # Must start in a newline first 
     \[\b(.*)\b\]   # Get what's enclosed in brackets 
     \n     # only capture bracket if a newline is next 
     (\b(?:.|\s)*(?!\[)) # should read: anyword that doesn't precede a bracket 
     """, re.MULTILINE | re.VERBOSE) 

haystack = """ 
[tab1] 
this is captured 
but this is suppose to be captured too! 
@[this should be taken though as this is in the content] 

[tab2] 
help me 
write a better RE 
""" 
m = regex.findall(haystack) 
print m 

です:!
[( 'TAB1'、「これがキャプチャされた\ Nbutの本があまりにも捕獲することが想定され、\ nは、[これは、このようものの取られるべきです@私を助けて ' '[TAB2]「、' \ n]はコンテンツである\ NWRITEより良いREの\ nの')]

編集:

regex = re.compile(r""" 
      ^   # Must start in a newline first 
      \[(.*?)\] # Get what's enclosed in brackets 
      \n   # only capture bracket if a newline is next 
      ([^\[]*) # stop reading at opening bracket 
     """, re.MULTILINE | re.VERBOSE) 

これは動作するようですが、それはまた、トリミングていますブラケット内部e内容。

答えて

3

Python正規表現は、再帰afaikをサポートしていません。

EDIT:

regex = re.compile(r""" 
     ^   # Must start in a newline first 
     \[(.*?)\] # Get what's enclosed in brackets 
     \n   # only capture bracket if a newline is next 
     ([^\[]*) # stop reading at opening bracket 
    """, re.MULTILINE | re.VERBOSE) 

EDIT 2:しかし、あなたのケースで、これは働くだろうはい、それは正常に動作しません。

import re 

regex = re.compile(r""" 
    (?:^|\n)\[    # tag's opening bracket 
     ([^\]\n]*)   # 1. text between brackets 
    \]\n     # tag's closing bracket 
    (.*?)     # 2. text between the tags 
    (?=\n\[[^\]\n]*\]\n|$) # until tag or end of string but don't consume it 
    """, re.DOTALL | re.VERBOSE) 

haystack = """[tag1] 
this is captured [not a tag[ 
but this is suppose to be captured too! 
[another non-tag 

[tag2] 
help me 
write a better RE[[[] 
""" 

print regex.findall(haystack) 

私はviraptorに同意します。正規表現はクールですが、ファイルのエラーをチェックすることはできません。おそらくハイブリッド? :P

tag_re = re.compile(r'^\[([^\]\n]*)\]$', re.MULTILINE) 
tags = list(tag_re.finditer(haystack)) 

result = {} 
for (mo1, mo2) in zip(tags[:-1], tags[1:]): 
    result[mo1.group(1)] = haystack[mo1.end(1)+1:mo2.start(1)-1].strip() 
result[mo2.group(1)] = haystack[mo2.end(1)+1:].strip() 

print result 

EDIT 3:^文字のみ[^squarebrackets]内の負のマッチを意味するので、それはです。それ以外の場合は文字列開始(またはre.MULTILINEの行開始)を意味します。正規表現の負の文字列マッチングのための良い方法はありません。文字だけです。

+0

おかげで、私は見、私が実際に再帰を試みたが、あなたは正しい(R?)私はそれを作るための方法を知っていますか?私は何をしようとしていますか? – cybervaldez

+0

Imに問題がありますが、コンテンツ内に括弧がある場合は停止するようです。 どのようにすれば、行の先頭に[括弧]が見つかった場合にのみ停止するようにしますか? [tab1] – cybervaldez

+0

ありがとうございます。この質問は非常に参考になりました。多くの詳細や代替案が登場しました。物事があなたの最初の解決策と実際にどのように違っているかについて私は非常に驚いています。なぜ私の解決策がうまくいかなかったのか、私は考えていません。(^ [\ n \ [] *)、改行の後に括弧があるときにこれを読み止めませんか?それはなぜ機能しないのですか?これは思考のためだけのものであり、あなたの答えはすでに完全に働いています。 – cybervaldez

2

これは必要な操作ですか?

regex = re.compile(r""" 
     ^     # Must start in a newline first 
     \[\b(.*)\b\]   # Get what's enclosed in brackets 
     \n      # only capture bracket if a newline is next 
     ([^[]*) 
     """, re.MULTILINE | re.VERBOSE) 

これは、タプル(1試合につき1つの2タプル)のリストを与える。あなたが平坦化されたタプルをしたい場合は、書くことができます。すべての

m = sum(regex.findall(haystack),()) 
+0

m = sum(regex.findall(haystack)、())チップをありがとう! – cybervaldez

3

まず、なぜあなたが解析しようとしている場合には正規表現?あなたが見ることができるように、正規表現はフィードバックを与えないので、あなた自身が問題の原因を見つけることはできません。また、REには再帰がありません。あなたは例外やボーナスなどのデバッグ実行する能力を持つハンドリングエラーを取得

def ini_parse(src): 
    in_block = None 
    contents = {} 
    for line in src.split("\n"): 
     if line.startswith('[') and line.endswith(']'): 
     in_block = line[1:len(line)-1] 
     contents[in_block] = "" 
     elif in_block is not None: 
     contents[in_block] += line + "\n" 
     elif line.strip() != "": 
     raise Exception("content out of block") 
    return contents 

は、あなたの人生をシンプルにしてください。また結果として辞書を取得し、処理中に重複したセクションを処理できます。私の結果:それは本当に働いていない

{'tab2': 'help me\nwrite a better RE\n\n', 
'tab1': 'this is captured\nbut this is suppose to be captured too!\[email protected][this should be taken though as this is in the content]\n\n'} 

はRE多くのこれらの日使い古され...応答のための

+0

はい、それは友人も私に示唆したものですが、将来の正規表現のために私に多くの助けになるだろうと思っています(単語を赦してください)。私は正規表現を使って作業を始めました。この仕事のような簡単な構文解析をして、おそらく私は正規表現の周りに私の方法を学ぶことはありません。これは私の正規表現と私が実際にそれを学ぶ必要があるものの外観から私の理解のためです。 – cybervaldez

関連する問題