1

我正在尝试从维基百科文章中获取介绍以将其包含在报告中。例如,对于这篇文章: http ://en.wikipedia.org/wiki/MAP3K8

我想得到:

丝裂原活化蛋白激酶激酶激酶 8 是一种在人体中由 MAP3K8 基因编码的酶。该基因是通过其在细胞中的致癌转化活性来鉴定的。编码的蛋白质是丝氨酸/苏氨酸蛋白激酶家族的成员。
这种激酶可以激活 MAP 激酶和 JNK 激酶途径。这种激酶被证明可以激活 IkappaB 激酶,从而诱导 NF-kappaB 的核产生。还发现该激酶在 T 淋巴细胞激活期间促进 TNF-α 和 IL-2 的产生。对大鼠类似基因的研究表明,这种激酶直接参与了 NF-kappaB1,p105 (NFKB1) 的蛋白水解。该基因还可以利用下游的框内翻译起始密码子,从而产生含有较短 N 端的同种型。较短的同种型已显示出较弱的转化活性。在小鼠中,该基因被称为 Tpl2,它是一种肿瘤抑制基因,其缺失有助于癌症的发展和进展。

我正在使用以下 URL 获取页面:http ://en.wikipedia.org/wiki/Special:Export/MAP3K8

我将这篇文章中的代码:http ://forums.asp.net/t/1066507.aspx/1转换为 C#:

   HttpWebRequest request  =(HttpWebRequest)HttpWebRequest.Create("http://  en.wikipedia.org/wiki/Special:Export/MAP3K8");
   request.Accept = "text/hmtl";
   request.Credentials = System.Net.CredentialCache.DefaultCredentials;
   HttpWebResponse response = (HttpWebResponse) request.GetResponse();
   Stream responseStream = response.GetResponseStream();
   XmlTextReader reader = new XmlTextReader(responseStream);
   String NS = "http://www.mediawiki.org/xml/export-0.8/";
   XPathDocument doc = new XPathDocument(reader);
   reader.Close();
   response.Close();
   XPathNavigator myxpathnav = doc.CreateNavigator();
   XPathNodeIterator nodesText = myxpathnav.SelectDescendants("text", NS, false);
   while (nodesText.MoveNext())
   {
       ViewBag.Message += nodesText.Current.InnerXml;
   }
   ViewBag.Summary = getSummary(ViewBag.Message);
   return View(); 

getSummary 方法,根据 PBB 模板:http ://en.wikipedia.org/wiki/Template:PBB_Controls

我只想获取蛋白质的信息,如果这是遵循这个。

   public string getSummary(string page)
    {
        string res = "";
        //The introduction is in 2 parts: 
        //1st between "{{PBB|geneid=1326}}" and <!-- The PBB_Summary (.)* -->
        string intro = "";
        //2nd between "summary_text =" and "=="
        //http://en.wik    ipedia.org/wiki/Special:Export/MAP3K8 is used as example

        string summary = "";
        try
        {
            intro = page.Split(new string[] { "}}" }, StringSplitOptions.None)[1];

            intro = intro.Split(new string[] { "<!--" }, StringSplitOptions.None)[0];
            intro = deleteMediaWikiTag(intro);
        }
        catch(Exception)
        {
            intro = "";
        }
        try
        {
            summary += page.Split(new string[] { "summary_text =" }, StringSplitOptions.None)[1];
            summary = summary.Split(new string[] { "==" }, StringSplitOptions.None)[0];
            summary = deleteMediaWikiTag(summary);
        }
        catch(Exception)
        {
            summary = "";
        }
        res = intro + "\n\n" + summary;
        return res;
    }

   public string deleteMediaWikiTag(string text)
    {
        string res = "";
        // this is working well
        Regex reg = new Regex("{{.*(}})*|{{|}}|'''|<!--.*-->|]]|([[]){2}");
        res = reg.Replace(text,"");
        //I don't understand what is wrong with this regex
        Regex regprime = new Regex("&lt(.)*(>){1}");
        res = regprime.Replace(res, "PRIME");
        return res;
    }

我的问题在于执行,deleteMediaWikiTag(summary)因为我丢失了摘要部分的结尾,即:

在小鼠中,该基因被称为 Tpl2,它是一种肿瘤抑制基因,其缺失有助于癌症的发展和进展。

在由正则表达式处理之前,此文本如下所示:

   <ref name="entrez" /> 
   In mice, this gene is known as Tpl2 and it is a tumor suppressor gene whose absence contributes to the development and progression of cancer.
   <ref>{{cite web|last=DeCicco-Skinner|first=Kathleen|title=Loss of tumor progression locus 2 (tpl2) enhances tumorigenesis and inflammation in two-stage skin carcinogenesis|url=http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3460638/}}</ref>

所以根据我的正则表达式,我期待类似:(PRIME 用于突出显示匹配项,最后,我将删除与我的正则表达式匹配的所有内容)

   PRIME In  mice *.....* PRIME

但我得到:

   PRIME

所以这"&lt(.)*(&gt;){1}"与整个部分匹配(第一个 < 和最后一个 > 但我要求只匹配一次模式 > 如果我把所有东西都拿走,那就不止一次了......

这个正则表达式有什么问题?我错过了什么?也许这是解析这个的更好方法?(但我发现的解析器都没有说服我)

PS 我的解析器适用于: http ://en.wikipedia.org/wiki/NFKB2或http://en.wikipedia.org/wiki/APOA4但我想更可靠地做到这一点。

4

1 回答 1

0

我真的找不到现有的任何问题。两个正则表达式都工作正常。我建议在代码中实现之前使用正则表达式在线测试器。试试这个: http: //gskinner.com/RegExr/

于 2013-04-21T11:28:11.437 回答