1

私はこのようにフォーマットされたファイルを持っています:

hello = {

     a = "2354a"
     b = "06567567h"


}

goodbye = {
     there = "/home/afhge"

}

...

anotherset = {
      dsfsdf = grhbrwecs
      dfgtmyj = 12345

}

私はPythonで正規表現を使用しています。一致させたいのは中括弧内のすべてであるため、結果の一致出力は次のリストになります。

['\n\n\ta = "2345a"\n\tb = "06567567h"\n\n\n', '\n\there = "/home/afhge"\n\n', '\n\tdsfsdf = grhbrwecs\n\tdfgtmyj = 12345\n\n']

私は正規表現を試しました:

desired_output = re.findall("{[^}]", file_text)

ただし、この正規表現はリストになります。

['{\n', '{\n', '{\n', '{\n', '{\n']

[^}]は、改行までの任意の文字と一致するようです。私はやってみました:

desired_output = re.findall("{[^}]", file_text, re.S)

desired_output  = re.findall("{[^}]", file_text, re.M)

成功しない:(。

ありがとう!

4

2 に答える 2

8

あなたのキャラクタークラスは正しくありません。一致しない文字と一致します}(改行も)。問題は、[^}]1文字だけに一致することです。繰り返し数量詞を使用するだけです(おそらくエスケープする必要があります{):

r"\{[^}]*"

あなたが試したオプションについて。何かre.Sが役立つとしたら、それ.がないと改行と一致しないからです。しかし、.実際に影響を受けるのはこれだけですre.S。他のオプションre.Mはそれとは何の関係もありません。これにより、アンカーが作成され、行の先頭^$末尾でも一致します。

また、角かっこ内のコンテンツのみが必要なため、{それ自体を一致させる必要はありませんが、代わりに後読みを使用できます。

r"(?<=\{)[^}]*"

これは{試合に含まれません。

于 2012-10-30T14:31:41.517 に答える
2

あなたは使用する必要があります(?<={).*?(?=})

一致を終了する場所と、最初の文字と一致するまで0から多くの文字に一致する正規表現がありません。 }.*?}

于 2012-10-30T14:33:26.483 に答える