1
>>> a = re.search('(\\d+h)?(\\d+m)?(\\d+s)?', 'in 1h15m')
>>> a.groups()
(None, None, None)
>>> a = re.search('.*(\\d+h)?(\\d+m)?(\\d+s)?', 'in 1h15m')
>>> a.groups()
(None, None, None)
>>> a = re.search('...(\\d+h)?(\\d+m)?(\\d+s)?', 'in 1h15m')
>>> a.groups()
('1h', '15m', None)

「...」バージョンが「グループ」に入力される唯一のバージョンであるのはなぜですか?

4

1 に答える 1

2

なぜ空のグループを取得するのですか?

最初のもの-a?a?aと一致"bbbaaa"

  • 最初の位置からマッチングを開始します。
  • 一致させようとしましaたが、見つかりません。それは大丈夫です、それはオプションなので、何も一致しません。(x 3回)
  • キャプチャされたグループが成功せずに、成功した空の一致を返します。

2番目-.*a?a?aと一致"bbbaaa"

  • .*最初の位置から最後の位置に一致します。
  • これで、文字列の最後になりました。
  • 一致させようとしましaたが、見つかりません。それは大丈夫です、それはオプションなので、何も一致しません。(x 3回)
  • キャプチャされたグループが成功せずに、すべての元のテキストとの一致が成功した場合を返します。

この問題を解決するにはどうすればよいですか?

正確に何をしようとしているのかは不明ですが、次の点に一致する可能性があります。

\d+h(\d+m)?(\d+s)?|(\d+m)(\d+s)?|(\d+s)

これにより、少なくとも1つの要素が一致することが保証されます。少なくともonオプションはオプションではありません。次に、使用可能なグループがない場合、正規表現は一致しません。(?| | )2番目のステップで解析してグループを取得するか、サポートされている場合はグループ変更機能を使用できます。

于 2012-07-16T10:07:56.613 に答える