5

グループと * 正規表現の機能を組み合わせて、トークナイザー / スプリッターのように振る舞う方法はありますか? 私はこれを試しました:

my_str = "foofoofoofoo"
pattern = "(foo)*"
result = re.search(pattern, my_str)

私のグループが次のようになることを望んでいました

("foo", "foo", "foo", "foo")

しかし、そうではありません。私はこれに驚きました。グループ機能は連携して機能します。

my_str= "Mr foo"
pattern = "(Mr)? foo"
result = re.search(pattern, my_str)
4

2 に答える 2

4

問題は、唯一のキャプチャ グループを繰り返すことです。つまり、1 つのブラケット ==> 1 つのキャプチャ グループしかなく、このキャプチャ グループは一致するたびに上書きされます。

詳細については、regular-expression.infoの Repeating a Capturing Group vs. Capturing a Repeated Groupを参照してください。(しかし、繰り返されるグループをキャプチャすることも、あなたが望むものではありません)

したがって、正規表現が完了すると、キャプチャ グループ 1 には最後に見つかった「foo」が含まれます。

これにより、期待される結果が得られます。

my_str = "foofoofoofoo"
pattern = "foo"
result = re.findall(pattern, my_str)

結果はリストです['foo', 'foo', 'foo', 'foo']

于 2012-07-10T08:53:18.567 に答える
3

グループをキャプチャし、*組み込みのreモジュールでは機能しません。代わりにfindallを使用してください。

pypiにはregexというライブラリがあり、その構文をサポートし、可変長のバックトラッキングなどの他のいくつかの機能を備えていると思います。

于 2012-07-10T08:29:41.527 に答える