1

文字のシーケンスで区切られたテキストのすべての出現をキャプチャする正規表現を構築することは可能ですか?言い換えれば、私は標準的な.split()方法に相当するものを探しています。

split()Tornado WebアプリケーションのURLルートの指定に正規表現が使用されているため、使用できません。例えば:

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

このような正規表現は、Tornado、Django、またはルートパターンを実装するその他のWebフレームワーク上に構築されたWebアプリケーションのURLルートを指定するときに役立ちます。特に、長さが不明なURLパスを引数のリストに解析します。

これまでのところ、私は次の正規表現を思い付くことができました。

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

残念ながら、式は一致/posts/show/some-slug/15しますが、。ではなく、最後に一致したグループ(15)のみを返します['show', 'some-slug', '15']

私が望んでいるのは達成することです:

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

4 に答える 4

5

Python では無制限の数のキャプチャを一致させる方法はありません。各キャプチャ グループは 1 つの一致のみをキャプチャでき、Python の定義により、最後の一致をキャプチャします。具体的には、MatchObject.group のドキュメントを参照してください。

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

具体的には、次のテキストでキャプチャ グループの制限について説明します。

複数回一致したパターンの一部にグループが含まれている場合は、最後に一致したものを返します。

したがって、複数の一致をキャプチャする唯一の方法は、キャプチャ グループの総数に上限を設定することです。したがって、次のようなもの (テストされていません) は、最大 5 つのキャプチャに一致します。

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

前のテンプレートに従って動的に正規表現の文字列を作成することもできますが、いずれにせよ、それはかなりひどいものになるでしょう。

于 2012-04-02T04:44:50.910 に答える
1

正規表現に一致するすべてのオカレンスをキャッチするには、次を使用します

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

パターンに従って分割するには、次を使用します。

re.split()

とても面白い機能

于 2011-03-08T00:43:57.323 に答える
1

試しましたか:str.split('/')?これはあなたが望むことを正確に行うはずです(私が正しく理解している場合)。正規表現でなければならない理由はありますか?

于 2011-03-07T22:37:29.590 に答える
0

Python 正規表現はわかりませんが、必要なのはグローバル マッチです。正規表現の最後にa を追加するgと、私がよく知っている言語でうまくいくはずです。

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

また、多くの言語には正規表現ベースのsplit機能があります。それが利用可能かどうか、または単に古き良き文字列分割関数 (実際には、ここで必要なツールのように思えます) を検討してください。

于 2011-03-07T22:41:47.230 に答える