次のような文字列からサブ文字列をキャプチャしようとしています
'some string, another string, '
結果一致グループを
('some string', 'another string')
私の現在の解決策
>>> from re import match
>>> match(2 * '(.*?), ', 'some string, another string, ').groups()
('some string', 'another string')
動作しますが、実用的ではありません。もちろん、ここで示していることは、実際のプロジェクトで行っていることと比較して、複雑さの点で大幅に削減されています。1つの「ストレート」(計算されていない)正規表現パターンのみを使用したいと思います。残念ながら、私の試みはこれまで失敗しました:
{2}は文字列全体ではなくスペースにのみ適用されるため、これは一致しません(結果としてなし)。
>>> match('.*?, {2}', 'some string, another string, ')
繰り返される文字列の前後に括弧を追加すると、結果にコンマとスペースが含まれます
>>> match('(.*?, ){2}', 'some string, another string, ').groups()
('another string, ',)
別の一連の括弧を追加することでそれは修正されますが、私はあまりにも多くなります。
>>> match('((.*?), ){2}', 'some string, another string, ').groups()
('another string, ', 'another string')
非キャプチャ修飾子を追加すると、結果は改善されますが、それでも最初の文字列が失われます
>>> match('(?:(.*?), ){2}', 'some string, another string, ').groups()
('another string',)
近くにいるような気がしますが、正しい道を見つけることができないようです。
誰かが私を助けることができますか?私が見ていない他のアプローチはありますか?
最初のいくつかの応答の後に更新します。
まず、みなさん、ありがとうございました。よろしくお願いします!:-)
元の投稿で述べたように、実際のコアの問題を描写するために、質問の多くの複雑さを省略しました。手始めに、私が取り組んでいるプロジェクトでは、大量のファイル(現在は1日あたり数万)をさまざまな行ベースの形式で解析しています(現在は5つ、まもなく25まで、場合によっては数百)。XML、JSON、バイナリ、その他のデータファイル形式もありますが、引き続き焦点を当てましょう。
多数のファイル形式に対処し、それらの多くが行ベースであるという事実を利用するために、ファイルを次々にロードし、すべての行に正規表現を適用して大きなファイルを返す、やや一般的なPythonモジュールを作成しました。一致するデータ構造。このモジュールはプロトタイプです。製品版では、パフォーマンス上の理由からC ++バージョンが必要です。これは、Boost :: Pythonを介して接続され、複雑さのリストに正規表現の方言の主題を追加する可能性があります。
また、2回の繰り返しはありませんが、現在のゼロから70(またはそれくらい)の間で変化する量です。コンマは必ずしもコンマではなく、最初に言ったことにもかかわらず、正規表現パターンの一部は実行時に計算する必要があります。「動的」な量を減らし、可能な限り多くの「固定」パターンを使用する理由があるとしましょう。
つまり、一言で言えば、正規表現を使用する必要があります。
言い換えると、問題の核心は次のようになります。たとえば、中括弧の繰り返しを含み、キャプチャできるPython正規表現表記はありますか。
'some string, another string, '
の中へ
('some string', 'another string')
?
うーん、それはおそらくそれをあまりにも絞り込みすぎます-しかし、あなたがそれを行う方法は間違っています:-D
2回目の言い換え:結果に最初の文字列(「いくつかの文字列」)が表示されないのはなぜですか?正規表現が一致を生成するのに(何かが2つある必要があることを示す)、1つの文字列(2番目の文字列)しか返さないのはなぜですか?
数値以外の繰り返しを使用した場合、つまり{2}の代わりに+を使用した場合でも、問題は同じです。
>>> match('(?:(.*?), )+', 'some string, another string, ').groups()
('another string',)
また、返されるのは2番目の文字列ではなく、最後の文字列です。
>>> match('(?:(.*?), )+', 'some string, another string, third string, ').groups()
('third string',)
繰り返しになりますが、あなたの助けに感謝します。私が実際に知りたいことを見つけようとしている間、ピアレビューがどれほど役立つか私を驚かせることをやめません...