2012-01-03 68 views
0

我似乎無法理解如何做到這一點。我試圖想出一個正則表達式(對於.NET來說,如果它有所作爲),它可以從包含帶句點的縮寫的文本塊中提取句子。基本上,我想從一個特定的開始詞開始,不要停在定義的縮寫列表上,並在結束時間結束。使用特定縮寫提取語句的正則表達式

一對夫婦的例子可能是:

Blah blah blah. Died of disease at Annapolis Junction, Md., February 2, 1862. Blah blah blah. 

將捕獲「在安納波利斯樞紐站,馬里蘭州,1862年2月2日,死於疾病。」 或

Blah blah blah. Died in General Hospital, Washington, D. C., September 17, 1862, of wounds received in action at Bull Run, Va., August 30, 1862. Blah Blah Blah. 

將捕捉「死在綜合醫院,華盛頓,D. C.,1862年9月17日,在公牛奔跑,弗吉尼亞州,1862年8月30日,在操作中收到的傷口」

使用的

Died [^\.]*\. 
當然

簡單表達式僅匹配到第一期:「在安納波利斯樞紐,馬里蘭州死於疾病。」

需要傳遞的列表縮寫將來自受控詞彙表,因此正則表達式不需要考慮所有可能的縮寫詞,而只需列出列表中的縮寫詞。即:Md。| D. C. |弗吉尼亞州|。密歇根州。

我知道下面是不行的,但它應該給的什麼,我試圖完成一個粗略的想法:

Died [^(Md\.|D\. C\.|Va\.|Mich\.)]*\. 

任何幫助,不勝感激!

-Matt

+0

是一個示例始終爲您呈現,其中所希望的句子是在中間?如果是這樣,你可以刪除外部句子。 – Origin 2012-01-03 05:28:29

+0

句子可能出現在文本塊的任何地方,並可能以任意數量的特定單詞開頭。 – Matt 2012-01-03 06:38:13

回答

0

我不認爲你可以使用正則表達式來跳過你不想匹配的事情的清單。你最好尋找不同的模式。

這適用於你這裏顯示的兩個例子,但如果所有的數據看起來像我不知道:

Died.*[0-9]{4}\. 

這基本上匹配「死」,然後一切多達四個數字(一個日期),然後是一段時間。

0

hereRegex to match . (periods marking end of sentences) but not Mr. (as in Mr. Hopkins))改編

private IEnumerable<string> GetSentences(string longString) 
{ 
    var pattern = @"(?<!Md|D_C|Va|Mich|Md)\."; 

    // Filter D. C. -> Replace with D_C. 
    longString = longString.Replace("D. C.", "D_C."); 
    var regex = new Regex(pattern); 
    var matches = regex.Split(longString); 

    var sentences = new List<string>(matches.Length); 

    foreach (var match in matches) 
    { 
     var sentence = match.Replace("D_C.", "D. C.").Trim(); 
     if(string.IsNullOrEmpty(sentence) == false) 
     { 
      sentences.Add(sentence); 
     } 
    } 

    return sentences; 
} 

D. C.的解決方法是,因爲圖案不該字符串,因此置換D_C.匹配。


實施例1

輸入
Blah blah blah. Died of disease at Annapolis Junction, Md., February 2, 1862. Blah blah blah.

  • Blah blah blah
  • Died of disease at Annapolis Junction, Md., February 2, 1862
  • Blah blah blah

實施例2

輸入
Blah blah blah. Died in General Hospital, Washington, D. C., September 17, 1862, of wounds received in action at Bull Run, Va., August 30, 1862. Blah Blah Blah.

  • Blah blah blah
  • Died in General Hospital, Washington, D. C., September 17, 1862, of wounds received in action at Bull Run, Va., August 30, 1862
  • Blah blah blah