0

私はこの正規表現を持っています:

a_list = re.compile(r'\(\d+\)\s*\n').split(content)

最終的に(数値)と行を一致させるのに最適ですが、その数値も取得する必要があります。

それ、どうやったら出来るの?

ありがとう。

4

2 に答える 2

2

Pythonの正規表現のドキュメントで説明されているように、正規表現のsplitメソッドは、正規表現パターンのすべての一致によって処理されている文字列を分割します。現在、正規表現は、末尾に数字が付いているすべての一致をキャプチャし、その一致で文字列を分割しています。したがって、a_listには、数値とその周囲の括弧(およびオプションのスペース)を除いて、数値を含むすべての行にすべてが含まれます。

(正規表現を作成するだけで)すべての改行を分割したくない場合は、ネガティブルックビハインド'\n'を使用して、別の正規表現が一致の前にある正規表現への一致のみをキャプチャできますが、その2番目の正規表現の一致は含まれません。結果。そのための形式では、x句が進行している場合にのみ、yのすべてのインスタンスがキャプチャされますが、x句は一緒に含まれません。(?<!x)y

この状況でネガティブルックビハインドを使用する場合の唯一の問題は、一致する文字数が固定されている必要があることですが\d+、は任意の数の文字である可能性があります。幸い、+先頭と先頭を削除するだけ\(で、正規表現パターンの前に少なくとも1桁あるかどうかを確認できるので、\d\);を確認するだけです。(10000)行がまたはで終わるかどうかは関係ないため、これは機能し(1)ます。

残念ながら、これにより、元々持ってい(abc123)た正規表現と一致しないような行がキャプチャされる可能性があります。\(\d+\)行が複数桁の数字のみを含む括弧で終わるようにする必要がある場合は、おそらく複数の正規表現操作を使用する必要があります。

それはの問題を残す\s*ので、2つのオプションがあります。最後にいくつのスペースがあるかがわかっている場合は、または式を作成できます。たとえば、改行文字との一致にを(\d|\d\s)含めるだけで、末尾の空白も削除できます。\s*

後者のオプションを選択すると、例はのよう(?<!\d\))\s*\nになります。その結果、a_listには、番号自体(およびその周囲の括弧)とともに、最後に番号を含むすべての行が含まれます。

于 2013-02-04T01:11:38.310 に答える
2

関数を使用splitするには、後読みアサーションが必要になる場合がありますが、残念ながら後読みには固定幅のパターンが必要です(@Thunderforgeが試したものです)。私の解決策は以下を利用しますfindall

re.findall(r'(.*?\(\d+\))\s*\n', content, re.S)

ノート:

  • フラグre.Sは「。」になります 改行を含むすべての文字に一致します
  • .*?欲張りでない一致を示します

しかし、このソリューションにはまだ欠陥があります。content数字と「\n」で終わらない場合、最後の部分は破棄されます。この問題は、リスト内包表記またはジェネレータ式によって解決できます。

[i or j for i, j in re.findall(r'(.*?\(\d+\))\s*\n|(.+)', content, re.S)]

また:

(i or j for i, j in re.findall(r'(.*?\(\d+\))\s*\n|(.+)', content, re.S))
于 2013-02-04T05:02:33.973 に答える