2010-03-13 82 views
2

我打算使用常規表達式或簡單的Perl oneliner從標準文本文件中刪除小寫句子片段。如何從文本中刪除小寫的句子片段?

這些通常被稱爲語音或屬性的標籤,例如 - 他說,她說,等

這個例子顯示了之前和使用手動刪除後:

  1. 原文:

「啊,那是完全正確的!」阿遼沙驚呼道。

「噢,請不要玩傻瓜!有些白癡進來了,你把我們 羞愧!」在窗邊哭泣的女孩,突然轉向她的父親 蔑視和輕蔑的空氣。

「等一下,瓦爾瓦拉!」她的父親哭着說道,但是很認真地看着他們。 「這是她的性格,」他說, 再次解決阿遼沙。

「你去哪兒了?」他問他。 「我想,」他說,「我忘記了一些東西......我的手帕,我想 ....好吧,即使我沒有忘記任何東西,讓我留一點 。」

他坐下了。父親站在他身上。 「你也坐下,」他說。


  • 所有小寫句子手動移除片段:
  • 「啊,這是完全正確的」

    「噢,請不要玩傻瓜!有些白癡進來了,你把我們 羞愧!」

    「等一下,瓦爾瓦拉!」 「那是她的性格,」

    「你去哪兒了?」

    「我想,」「我忘記了一些東西......我的手帕,我想 ....好吧,即使我沒有忘記任何東西,讓我留一點 。」

    他坐下了。父親站在他身上。

    「你坐下了,」


    我變直引號「,以平衡和嘗試:」 [。](...)+

    當然,這消除一些片段,但刪除一些文本的平衡引號和文本以大寫字母開頭。[^ AZ]在上述表達式中不起作用。

    我意識到可能不可能達到100%的準確度,但任何有用的表達式,perl或python腳本都將深受讚賞。

    乾杯,

    亞倫

    +0

    如果不是「父親站在他身上」,你會做什麼?這句話是「父親站在吉姆身上。」? – Robusto 2010-03-13 20:53:13

    +5

    我認爲你需要給出一個更清晰的'小寫句子片段'的定義。 特別是,爲什麼「驚歎阿遼沙」。一個小寫的句子片段,但「父親站在他身上。」不是? – Dancrumb 2010-03-13 21:06:14

    +0

    我認爲「小寫的句子片段」,他的意思是「信號短語」http://nutsandbolts.washcoll.edu/quoting.html#signal – 2010-03-14 21:47:49

    回答

    3

    下面是一個Python代碼段應該做的:

    thetext="""triple quoted paste of your sample text""" 
    y=thetext.split('\n') 
    for line in y: 
        m=re.findall('(".*?")',line) 
        if m: 
         print ' '.join(m) 
        else: 
         print line 
    
    0

    Text::Balanced模塊是你彷彿是,如果以後你打算使用Perl。下面應該能夠提取你的例子中所有引用的語音(不漂亮,但完成工作)。

    它也適用於丹尼斯的測試案例。

    下面的代碼的優點在於,報價是由段分組,其可以是或可以不是用於以後的分析

    有用腳本

    use strict; 
    use warnings; 
    use Text::Balanced qw/extract_quotelike extract_multiple/; 
    
    my %quotedSpeech; 
    
    { 
        local $/ = ''; 
        while (my $text = <DATA>) { # one paragraph at a time 
    
         while (my $speech = extract_multiple(
              $text, 
              [sub{extract_quotelike($_[0])},], 
              undef, 
              1)) 
         { push @{$quotedSpeech{$.}}, $speech; } 
        } 
    } 
    
    # Print total number of paragraphs in DATA filehandle 
    
    print "Total paragraphs: ", (sort {$a <=> $b} keys %quotedSpeech)[-1]; 
    
    # Print quotes grouped by paragraph: 
    
    foreach my $paraNumber (sort {$a <=> $b} keys %quotedSpeech) { 
        print "\n\nPara ",$paraNumber; 
        foreach my $speech (@{$quotedSpeech{$paraNumber}}) { 
         print "\t",$speech,"\n"; 
        } 
    } 
    # How many quotes in paragraph 8? 
    print "Number of quotes in Paragraph 8: ", scalar @{$quotedSpeech{8}}; 
    

    __DATA__

    「啊,那是完全正確的!」阿遼沙驚呼道。 「

    」哦,不要玩傻瓜! 有些白癡進來了,你把我們給 慚愧!「在窗邊哭泣的女孩, 突然轉向她的父親與 輕蔑和輕蔑的空氣。

    「等一下,瓦爾瓦拉!」哭泣她的父親 ,說得很透露,但 非常讚賞地看着他們。 「這是她的性格,」他說, 再次解決阿遼沙。

    「你去哪兒了?」他問他。

    「我認爲,」他說,「我忘了 東西......我的手帕,我覺得 ....好吧,即使我還沒有 忘記任何東西,讓我留一個 小「。

    他坐下了。父親站在他身上。 「你也坐下,」他說。

    他說:「它並不總是奏效。」

    「其次,」我說,「 三個引用短語失敗......」他完成了 我的想法,「有兩個沒有引號的。

    我回答說:「沒錯。」沮喪。

    輸出

    Total paragraphs: 10 
    
    Para 1 "Ah, that's perfectly true!" 
    
    
    Para 2 "Oh, do leave off playing the fool! Some idiot comes in, and you put us 
    to shame!" 
    
    
    Para 3 "Wait a little, Varvara!" 
         "That's her character," 
    
    
    Para 4 "Where have you been?" 
    
    
    Para 5 "I think," 
         "I've forgotten something... my handkerchief, I think.... Well, even if 
    I've not forgotten anything, let me stay a little." 
    
    
    Para 7 "You sit down, too," 
    
    
    Para 8 "It doesn't always work." 
    
    
    Para 9 "Secondly," 
         "it fails for three quoted phrases..." 
         "with two unquoted ones." 
    
    
    Para 10 "That's right." 
    
    +0

    'perl script.pl textfile'沒有輸出。 – 2010-03-14 00:48:37

    +0

    @丹尼斯:那是因爲你需要以現在寫的方式運行腳本作爲'perl script.pl「文本」'。 – Zaid 2010-03-14 04:27:59

    +0

    然後幾個OP的例子不起作用。 – 2010-03-14 04:43:13

    0

    我不完全相信你可以使用正則表達式的下面,您使用的,如果你使用的是支持原子團東西編輯器(如EditorPad專業版)主編做搜索和替換:

    搜索

    (".+?"|^[A-Z].+\r\n)(.(?!"))* 
    Note: you should replace \r\n with \n or \r according to your line breaks 
    

    \1 
    

    這裏替換爲正則表達式一點解釋:

    第一捕獲組爲報價和線開始以大寫字母字符之間。第二個捕獲組適用於在引用之後但在另一個引用之前的任何字符。

    +0

    我沒有看到該正則表達式中的任何原子組 - 只有兩個捕獲組和負向前瞻。 – 2010-03-15 13:51:20

    0

    這適用於在問題中所示的所有情況:

    sed -n '/"/!{p;b}; s/\(.*\)"[^"]*/\1" /;s/\(.*"\)\([^"]*\)\(".*"\)/\1 \3/;p' textfile 
    

    它未能對這樣的情況下:

    He said, "It doesn't always work." 
    
    "Secondly," I said, "it fails for three quoted phrases..." He completed my thought, "with two unquoted ones." 
    
    I replied, "That's right." dejectedly. 
    
    0

    如果我明白你是什麼後...每次路過通過這樣的正則表達式應該工作...

    你可以使用perl調試器來玩弄這個。在linux/mac的命令行中跳入perl調試器,只有perl -de 42。 (其中「42」只是一個有效的表達 - 它可以是任何東西,但爲什麼不選擇生活的意義?)

    反正

    open FILE, "<", "filename.txt" or die $!; 
    while (my $line = <FILE>) { 
        @fixed_text = $line =~ m{(?:(" .+? ")) | (?:\A .* [^"] .* \z)}xmsg; 
        for my $new_line (@fixed_text) { 
        print qq($new_line); 
        } 
        print qq(\n); 
    } 
    

    注:對不起,我不得不編輯 - 沒有看到你想要的行沒有任何引號...

    是的,正則表達式和Perl是驚人的。它應該是100%準確的並獲得所有實例,除非段落中的報價延伸