1

私は独自のマークダウン拡張機能を作成しようとしています。ビデオでは、ユーザーが幅と高さのオプションの値を提供できるようにしたいと考えています。利用可能なマークダウンの形式は次のとおりです。

http:/vimeo.com/456456456[width,height]
http:/vimeo.com/456456456
http:/vimeo.com/456456456[,height]
http:/vimeo.com/456456456[width,]

最初の部分については質問がありませんが、最後の幅と高さについてのみ質問があります。私の現在の正規表現は次のようになります。

rx = r'([^(]|^)(http|https)://(?:www.|)vimeo\.com/(?P<vimeoid>\d+)(?:\[(?P<width>\d+|),\s*,\s*(?P<height>\d+|)\]|)\S*'

実際に興味深いのはその最後の部分だけです: (?:\[(?P<width>\d+|),\s*,\s*(?P<height>\d+|)\]|). 幅と高さの値を指定すると、正常に機能します。しかし、それを省略したり、ブラケット部分全体を省略したりしても (問題ないはずです)、コードはキャプチャされたグループを forwidthheightwith valuesで返しますNone。それは私が望むものではありません。

used が幅または高さを提供しないか、空の括弧を提供するか、まったく提供しない場合、幅と高さのグループは評価されません。

UPD: Python の正規表現の副作用かもしれません。名前付きグループを常に評価するかどうかはわかりません。

4

1 に答える 1

3

グループに含まれるものではなく、グループ自体をオプションにします。

...(?:\[(?P<width>\d+)?\s*,\s*(?P<height>\d+)?\])?

また?、通常、空の代替よりも読みやすくなります (そして潜在的に効率的です)。

ここで、どちらかを省略した場合widthは、 にm.group(width)なりますNone(同様に も同様ですheight)。それを取り除く方法はないことに注意してくださいNone。正規表現を適用するreと、パターン内のグループに対応するすべての値が初期化されます (つまり、パターン内のすべての番号付きグループとすべての名前付きグループが定義され.group()ます)。一致に参加するグループと参加しないグループの違いは、文字列 (おそらく空の文字列) を生成するか、None. そんな感じです。

このパターンでは[,]、括弧を完全に省略することの同義語としても使用できることに注意してください。

于 2013-06-28T12:38:14.093 に答える