2011-03-07 5 views
1

キャプチャする正規表現を作成することは可能ですか?すべての出現の文字は一連の文字で区切られますか?言い換えれば、標準の.split()メソッドと同等のものを探しています。文字列で区切られたすべてのテキストをキャプチャするための正規表現

Tornado WebアプリケーションのURLルートを指定する際に正規表現が使用されるため、split()は使用できません。たとえば:トルネード、Djangoのか、ルートパターンを実装し、他のWebフレームワークの上に構築されたWebアプリケーションのURLルートを指定する際

handlers = [ 
    (r'/posts/([0-9a-zA-Z_\-]+)', PostsHandler), 
] 

このような正規表現は便利です。特に、未知の長さのURLパスを引数のリストに解析する。

は、これまでのところ私は、次の正規表現を思い付くために管理している:

/^\/posts(?:\/([a-zA-Z0-9_\-]+))+/ 

残念ながら、式は/posts/show/some-slug/15と一致する一方で、それが唯一の代わり['show', 'some-slug', '15']の、最後のマッチング・グループ(15)を返します。

私は達成されたいです:

  • /posts/edit/15/ =>['edit', '15']
  • /posts/edit/15 =>['edit', '15']
  • /posts/2010/15/11 =>['2010', '15', '11']
+0

分割を使用できない理由はありますか?あなたの望む結果が組み込み関数が返すものとまったく同じなら、なぜ組み込み関数を使用しないのですか? –

+0

「一連の文字で囲まれた」ことを説明する必要があります。 2番目の例では、 '15'は囲まれていません。あなたの3番目の例では、 '11'は囲まれていません。また、 ".split()メソッドと同等"と言っていますが、あなたの正規表現ではそれに一致する '[a-zA-Z0-9 _ \ - ] +'にテキストが制限されています。 –

+0

あなたのregex(sed/perl/awkスタイルで書かれています)は、文字列が '/ posts'で始まらなければならないことを指定していますが、あなたの例はどれも'/posts'で始まっていません。 3番目の例には、入力ミス(achives)があります。実際に実行したコードからではなく、(dim)メモリからすべての質問を入力しているようです。削除してもう一度やり直してください。あなたが 'Python'タグについて真剣であれば、Pythonコードとその出力を表示してください。 –

答えて

1

は、あなたが試してみました:str.split('/')を?これはあなたが欲しいものを正確に行うはずです(私が正しく理解していれば)。それが正規表現でなければならない理由はありますか?

0

私はPythonの正規表現はわかりませんが、あなたが望むのはグローバルマッチです。あなたの正規表現の末尾にgを追加する場合は、私がよく知っている言語のトリックを行う必要があります。

/^\/posts(?:\/([a-zA-Z0-9_\-]+))+/g 

また、多くの言語に正規表現ベースのsplit関数があります。それが利用可能な場合、または単に古い文字列分割関数(これは本当にあなたがここで必要なツールのように思われる)を考慮してください。正規表現にマッチしたすべての出現箇所をキャッチする

+0

私はすでにそれを試みましたが、うまくいきません。 また、私は 'split()'関数を知っています。私はちょうどそれを使用することはできません。 –

1

、あなたはパターンに従って分割するには

[ match.groups(....) for match in pattern.finditer(the_string) ] 

を使用し、使用:

re.split() 

非常に興味深い機能

3

方法はありません無限の数のキャプチャをPythonで照合する必要があります。各キャプチャグループは1つのマッチをキャプチャすることしかできず、Pythonの定義では最後のマッチをキャプチャします。具体的には、MatchObjectのドキュメントを参照してください。グループ:

http://docs.python.org/library/re.html#re.MatchObject.group

具体的には、次のテキストは、キャプチャグループの制限を説明:

グループが複数回マッチしたパターンの一部に含まれている場合、 最後のマッチがあります戻ってきた。

したがって、複数の一致をキャプチャする唯一の方法は、総キャプチャグループの上限を作成することです。したがって、次の(未テスト)のようなものは、5つのキャプチャまで一致します

/^\/posts\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-])+)?)?)?)? 

あなたが潜在的に前のテンプレート以下の動的正規表現の文字列を構築することができますが、いずれかの方法で、かなり恐ろしいことになるだろう。

関連する問題