2011-11-07 2 views
0

私は正規表現を持っていて、ピリオドや?で終わらないテキストが含まれている "見出し行"をすべて見つけるはずです。または:!Python、この正規表現の仕組み

tit_pat = re.compile(r"([\w ]+?)(?![!?.])\n",re.UNICODE) 
res = tit_par.findall(data) 

: 例:

章1xのテスト
このテストテストテストテストテスト。これはいくつかのテキストとより多くの テキストでのテストです。これはいくつかのテキストとより多くのテキストといくつかのテキストとより多くのテキストとのテスト。 これはもう少しのテキストです。もう少しのテキストです。もう少しのテックスです。もう少しテキストです。 チャプターaaa
これはテストです。このテストは、あるテキストとより多くのテキストといくつかのテキストとより多くのテキストといくつかのテキストとより多くのテキストといくつかのテキストとより多くのテキスト。
bbbb
終了です。

正規表現は、ピリオドと改行のないテキストを含むすべての「見出し行」を検索しています。受け入れる前にピリオド(または!または?)でないチェックがある(否定的な)先読みステートメントがあるため、これが予想されます。 しかし、私は行で始まり、次の行にピリオドで終わる文を持つかもしれません。正規表現は、ピリオドのないテキストの行を見つけられません。この動作の説明はありますか?

答えて

1

あなたの正規表現は、基本的には「可能な限り少ない単語を見つけて、単語の後に不要な文字がないようにし、それらの単語の直後に改行を見つける」という意味です。単語チェックの部分は、単語の一部ではないので、不要な文字を見つけることはできません。改行は不要な文字ではないので、先読みのアサーションは冗長です。

"あなたは、最後の文字が不要な文字の1つでないような行を見つけてください"と思っています。これはおそらく実際には正規表現を必要としないでしょうが、もしそれらを使いたいのであれば、一度に1行ずつテキストを取り込み、次に(?<![.!?])$のようなものにsearchを入れてください。

+0

正規表現を使用しているのは、検索操作を行うために大きなファイルを文字列として読み込んでいるためです。私は "先を見て"削除して、それはまだ期待どおりに実行しています。ありがとうKarl Knechtel! – user963386