【问题标题】:Regex for extracting sentences with specific abbreviations用于提取具有特定缩写的句子的正则表达式
【发布时间】:2012-01-03 04:58:19
【问题描述】:

我似乎无法理解如何做到这一点。我正在尝试提出一个正则表达式(如果它有区别,则适用于.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.

将捕捉“1862 年 9 月 17 日死于华盛顿特区综合医院,死于 1862 年 8 月 30 日在弗吉尼亚州布尔伦的行动中受伤。”

使用简单的表达方式

Died [^\.]*\.

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

需要传递的列表缩写将来自受控词汇表,因此正则表达式不需要考虑所有可能的缩写,只需考虑列表中的缩写即可。即:医学博士| D。 C.|弗吉尼亚州。|密歇根州。

我知道以下内容不起作用,但它应该大致了解我要完成的工作:

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

非常感谢任何帮助!

-马特

【问题讨论】:

  • 示例是否总是如您所见,所需的句子在中间?如果是这样,你可以去掉外面的句子。
  • 句子可以出现在文本块中的任何位置,并且可以以任意数量的特定单词开头。

标签: .net regex


【解决方案1】:

我认为您不能使用 Regex 跳过您不想匹配的内容列表。你最好寻找不同的模式。

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

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

这基本上匹配“死亡”,然后是最多四个数字(一个日期)后跟一个句点的所有内容。

【讨论】:

    【解决方案2】:

    改编自here (Regex 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2017-12-19
      • 2022-08-08
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      相关资源
      最近更新 更多