2013-12-20 9 views
5

に基づいて必要な...パイソン:ラインからの文抽出 - 正規表現はややここでのpython /プログラミング初心者の基準

を、私は、テキストの行から抽出する文章を扱うことができる正規表現を思い付くしようとしていますファイルを作成し、リストに追加します。コード:

import re 

txt_list = [] 

with open('sample.txt', 'r') as txt: 
    patt = r'.*}[.!?]\s?\n?|.*}.+[.!?]\s?\n?' 
    read_txt = txt.readlines() 

    for line in read_txt: 
     if line == "\n": 
      txt_list.append("\n") 
     else: 
      found = re.findall(patt, line) 
      for f in found: 
       txt_list.append(f) 


for line in txt_list: 
    if line == "\n": 
     print "newline" 
    else: 
     print line 

上記のコードの最後の5行ごとのように印刷出力: 'SAMPLE.TXT' の

{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}! 
What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said. 

newline 
I am the {very last|last} sentence for this {instance|example}. 

内容:私はで遊んでてきた

{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}! What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said. 

I am the {very last|last} sentence for this {instance|example}. 

数時間の正規表現と私はそれをクラックするように見えることはできません。正規表現は、for lunch?の最後には一致しません。したがって、これらの2つの文What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said.は分離されません。それは私が望むものです。正規表現のための

いくつかの重要な詳細:

  • すべての文章は常にピリオドで終わるだろう、感嘆符や疑問符
  • すべての文章は常に{」中括弧の少なくとも1組が含まれています} また、誤解を招くようなことはありません。すべての文章の最後の括弧の後に。したがって、Dr.は、各文の中括弧の最後の対の前になります。これは私が '}'を使って私の正規表現の基底にしようとした理由です。このようにして、例外アプローチを使用しないで、Dr.,Jr.approx.というような文法の例外を作成することを避けることができます。このコードを実行するファイルごとに、私は個人的に、最後の '}'の後に誤解を招く期間がないことを確認します。

私が欲しいの出力はこれです:私が持っている

{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}! 
What {will|shall|should} we {eat|have} for lunch? 
Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said. 

newline 
I am the {very last|last} sentence for this {instance|example}. 
+0

この「{こんにちは|こんにちは| Howdy}博士Munchausonあなた{紳士|ファインフェロー}!」誤解を招く "。ここでは、最初の期間は、この "文"の最後の括弧の後にもあります。 "{こんにちは|こんにちは|ハウディ} – oyss

+0

その文では、 '!'文の終わりであり、 '!'その文の最後の '}'の後に来ます。私がOPで説明しているように、文はピリオド、感嘆符、または疑問符で終わることができます。 –

答えて

2

最も直感的な解決策はこれです。基本的には、Dr.トークンとMr.トークンをアトムとして扱う必要があります。内訳

patt = r'(?:Dr\.|Mr\.|.)*?[.!?]\s?\n?' 

、そのは言う:

くれMr.秒、Dr.秒の最小数またはゼロが続いているゼロまたは1つのスペースが続く句読点マークまでの任意の文字を探しますまたは1つの新しい行。

このsample.txtの上で使用(私はラインを追加しました):

{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}! What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said. 

But there are no {misters|doctors} here good sir! Help us if there is an emergency. 

I am the {very last|last} sentence for this {instance|example}. 

それが与える:

{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}! 
What {will|shall|should} we {eat|have} for lunch? 
Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said. 

newline 
But there are no {misters|doctors} here good sir! 
Help us if there is an emergency. 

newline 
I am the {very last|last} sentence for this {instance|example}. 
+0

こんにちは、私は多くのテキストファイルでこのコードを実行するので、私は本当に例外を避けることを望んでいた。ですから、 'Sr.''''''''''''''''''''''''''''''などのような例外が多くあります。私が今確実にしている唯一のことは、すべての文で最後の中かっこ '}'の後に '.'がないことです。もちろん' .'が実際に文の終わりでない限りです。 –

+0

私はあなたが一般的なものを持つことはできないと思います。最後の中括弧の後の唯一のピリオドは略語ではなく、正規表現はどのようにして 'Dr.'と '}の違いを知ることができますか?彼らは両方の文字の後にピリオドが続きます。前者には大文字がありますが、それは 'aboutx'、' info''、 'etc'などを排除していると言えるでしょう。文で"有効な "期間を宣言することなく、あなたが求めていることをすることができます。 –

+0

私は見て、私の正規表現のスキルは、タスクのために十分ではないことを望んでいた。さて、私は実質的な例外のアプローチに降伏すると思います。助けてくれてありがとう:-) –

2

あなたが依存関係を追加する気にしない場合は、 NLTKライブラリには、必要な処理を行うべきであるsent_tokenize関数がありますが、中括弧が干渉するかどうかは完全にはわかりません。

使用される方法NLTKを記述する論文は40ページ以上です。文の境界を検出することは簡単な作業ではありません。

+0

ありがとう。私は 'sent_tokenize'が存在することを知っていましたが、私はそれをまだ打ち出していませんでした。私はここでスクリプトを中括弧と正規表現の後ろに置くことを望んでいましたが、それは起こっていないように見えます。これらの中括弧を含む複数のファイルに対して 'sent_tokenize'を試したところ、すべての文を正確に分割していましたので、私はそれに固執すると思います。それは私が望むように改行を保持しませんが、私はそれのために少しコードを作業することができます。 Cheers –

+0

テキストブロック全体をトークン化するのではなく、各行を 'sent_tokenize'に別々に送ることができます。あなたが文章がソースファイルの1行を越えることを期待していない限り、それはあなたが望むように改行を保存できるはずです。 – aelfric5578

関連する問題