5

私は自分のコードでPython正規表現(reモジュール)を使用していますが、これらの場合の動作が異なることに気づきました。

re.findall(r'\s*(?:[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # non-capturing group
# results in ['a) xyz', ' b) abc']

re.findall(r'\s*(?<=[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # lookbehind
# results in ['a', ' xyz', ' b', ' abc']

私が取得する必要があるのはただ['xyz', 'abc']です。例の動作が異なるのはなぜですか?また、どのようにして目的の結果を得るのですか?

4

2 に答える 2

5

2 番目のケースaにとbが含まれている理由は、 最初に検索され、ルックアラウンドが文字列の先頭に戻っている文字を消費しないためです。(?<=[a-z]\))a)[^.)]+a

今、あなたはにいます。あなたはオプションのマッチ)を作ったので(?<=[a-z]\))[^.)]+xyz

これと同じことが繰り返されますb) abc

2番目のケースから削除する?と、期待される結果が得られます。['xyz', 'abc']

于 2013-02-04T17:53:04.860 に答える