用于提取带有特定缩写的句子的正则表达式



我似乎就是不知道该怎么做。我正试图想出一个正则表达式(如果它有区别的话),它可以从包含缩写和句号的文本块中提取句子。基本上,我想从一个特定的开始词开始,不要停在一个定义的缩写列表上,以结束句号结束。

一些例子可能是:

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.

将捕捉"1862年9月17日死于华盛顿特区总医院,1862年8月30日在弗吉尼亚州布尔朗战役中负伤。"

使用简单的

表达式
Died [^.]*.

当然只匹配第一个时期:"死于疾病在安纳波利斯交界处,马里兰州。"

需要传递的列表缩写将来自受控词汇表,因此regexp不需要考虑所有可能的缩写,只考虑列表中的缩写。即:Md。| D。密歇根州弗吉尼亚州c | |

我知道下面的内容行不通,但它应该能让我大致了解我想要完成的任务:

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

任何帮助都非常感谢!

马特

我不认为您将能够使用Regex跳过您不想匹配的列表。你最好找一个不同的模式。

这适用于您在这里展示的两个示例,但我不确定您的所有数据是否都是这样的:

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

这基本上匹配"死亡",然后是四个数字(日期)后面跟着一个句号。

从这里改编(正则表达式匹配)。(句点标记句尾)但不是Mr.(如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

最新更新