1

次の形式で Web サイトの構成ファイルを読み取る関数を作成しようとしています。

routename, optional_path, Title With Spaces;
otherroute, other title {
    nestedroute, :can_have_semicolon, Nested Title;
};

differentroute, Awesome Title Ya'll;

(私は残り火アプリを書いています)

だから私はすべての点でうまく機能している再帰式を書きましたが、実際の個々のアイテムを分割する正規表現は私にあらゆる種類の頭痛の種を引き起こしました.

まず、再帰関数に与えられた文字列全体が次のように分割されます。

filter(None, re.split(r";\n*(\b|$)", routes))

これにより、最高位のグループが分離されます (上記の例は、2 つの部分に分割されます。1 つは角かっこ付きで、もう 1 つは角かっこなしですが、どちらも末尾のコロンはありません)。

個々のアイテムに次の正規表現が含まれている{か、使用されている場合:}

route, path, title, bundle = re.match(r"\s*(\w+)\s*,\s*(\S*?)\s*?,?\s*([\w ]+)\s*{\s*(.+)\s*}\s*", r, flags = re.S).groups()

バンドルは、タブを「インデント解除」した後、再帰的に処理されます。

それ以外の場合は、次の正規表現が使用されます。

route, path, title = re.match(r"\s*(\w+)\s*,\s*(\S*?)\s*?,?\s*([\w ]+)\s*", r).groups()

ここでは、両方とも空白コードを削除してより明確に記述しています。

re.match(r"(\w+),(\S*?),?([\w ]+){(.+)}", r, flags = re.S).groups()
re.match(r"(\w+),(\S*?),?([\w ]+)", r).groups()

私はあらゆる種類のクレイジーな行動をとってきました。基本的にパスは任意ですが、タイトルとルートは必須で、タイトルはスペースを入れられる必要があります。括弧内のものは、これらの同じ式によって再帰的に処理されるため、無差別に取得されます。

私はこれらの多くのバリアントを使用しました。パスをまったく取得しないもの、パスなしでは機能しないもの、:パスでサポートされないもの、タイトルを分割するもの、文字をランダムにドロップするもの、またはそこからの言葉。入力が多すぎて覚えられないバリアントが多すぎます。現状では、2 番目の正規表現 (単純なバージョンに焦点を当てており、ブラケットの動作で問題が発生していないように見えるため、機能するようになったらブラケットの動作を追加します)、次の入力を使用します。

customer, path, Customer Account

次の出力が得られます。

('customer', '', 'path')

ただし、パスなし:

customer, Customer Account

それは私がやりたいことをやっています。

('customer', '', 'Customer Account')

さらに情報が必要な場合は、お問い合わせください。これはもう長いです。

4

1 に答える 1

2

あなたの正規表現はコンマをオプションにしますが、その前の単語はオプションにしません。組み合わせをオプションにする必要があります。

(\w+),(?:(\S*?),)?([\w ]+){(.+)}
于 2013-10-05T01:19:59.650 に答える