【问题标题】:Searching titles in medline database with entrez and biopython使用 entrez 和 biopython 在 medline 数据库中搜索标题
【发布时间】:2016-04-19 23:08:42
【问题描述】:

我正在尝试搜索标题中包含特定单词的论文。更准确地说,是 2010 年至 2015 年间发表的论文中的病毒或病毒一词。这是我的代码:

import re
from Bio import Medline

handle = Entrez.esearch(db="pubmed",  # database to search
                    term="2010[Date - Publication]:2015[Date - Publication]"
                    )
record = Entrez.read(handle)
handle.close()

pmid_list = record["IdList"] #list of records

handle = Entrez.efetch(db="pubmed", id=pmid_list, rettype="medline",     retmode="text")
records = Medline.parse(handle)

titles = [] # start with empty list of titles
for record in records:
    ti_list = record['TI'] #titles
    for title in ti_list:
        if title == "virus" and title not in titles: #searching viral/virus
        titles.append(title)

print('Publications with viral or virus in the title:')
for record in records:
    print(" ", title)

如果我只是简单地打印(记录['TI'],那么我会在我的搜索查询中获得所有标题的列表。但是,我无法搜索特定的单词。我认为我的错误可能在“ if title == "virus"(因为显然没有任何论文会单独以这个词命名)。

我很困。有没有更好的方法在我查询的论文标题中搜索这个词?

谢谢。

编辑:更新代码(仍然没有运气)

import re
from Bio import Medline

handle = Entrez.esearch(db="pubmed",  # database to search
                    term="2010[Date - Publication]:2015[Date - Publication]"
                    )
record = Entrez.read(handle)
handle.close()

pmid_list = record["IdList"] #list of records

from Bio import Medline
handle = Entrez.efetch(db="pubmed", id=pmid_list, rettype="medline",     retmode="text")
records = Medline.parse(handle)

r = re.compile(r"\bvir(al|us)\b")
titles = set()  # start with empty list of titles
for record in records:
    ti_list = record['TI']  # titles
    for title in ti_list:
        if r.search(title):  #
            titles.add(title)

print('Publications with viral or virus in the title:')
for record in records:
     print(" ", title)

新代码:

import re
from Bio import Medline
handle = Entrez.efetch(db="pubmed", id=pmid_list, rettype="medline", retmode="text", 
                       term="2010[Date - Publication]:2015[Date - Publication]")
records = Medline.parse(handle)
titles = []
for record in records:
    ti_list = record['TI']
    for title in ti_list:
        titles.append(title)
handle.close()
for title in titles:
    print(title)

【问题讨论】:

    标签: python regex biopython


    【解决方案1】:

    如果要匹配子字符串,请使用 in 查看标题中是否包含任何单词:

    words  = ("viral","virus")
    if any(w in title for w in words) and title not in titles: #
    

    但您似乎想要过滤记录,以获得任何包含病毒或病毒的记录标题:

    st  = {"viral","virus"}
    
    filtered_records = [ record for record in records if any(w in st for w in record['TI'] )]
    

    如果您想匹配子字符串并使用模式,那么您实际上需要将其设为正则表达式,"vir(al|us)" 只是您代码中的一个字符串:

    import re
    
    r = re.compile("vir(al|us)")
    filtered_records = [record for record in records if any(r.search(w) for w in record['TI'])]
    

    您自己的循环中的正则表达式将转到您的 if 所在的位置:

    import re
    
    r = re.compile(r"vir(al|us)")
    if r.search(title) and title not in titles: 
          .......
    

    如果您不希望病毒等匹配,请为您的正则表达式使用单词边界:

    r = re.compile(r"\bvir(al|us)\b")
    

    您还应该将标题设置为一个不能重复的集合,这是一个使用您自己的代码的工作示例:

    r = re.compile(r"\bvir(al|us)\b")
    titles = set()  # start with empty list of titles
    for record in records:
        ti_list = record['TI']  # titles
        for title in ti_list:
            if r.search(title):  #
                titles.add(title)
    

    可以变成集合理解:

    r = re.compile(r"\bvir(al|us)\b")
    
    titles = {title for record in records for title in record['TI']  if r.search(title)} # titles
    

    由于record['TI'] 返回的是字符串而不是列表:

    r = re.compile(r"\bvir(al|us)\b")
    titles = set() 
    for record in records:
        title = record['TI']  # title is a str not a list
        if r.search(title):  #
               titles.add(title)
    

    对 set comp 或任何其他示例执行相同操作。

    【讨论】:

    • 对不起,我对此很陌生。我如何将您答案的正则表达式版本放入我的代码中?
    • @user3723011,你想达到什么目的?您正在添加到标题列表,但您似乎没有使用它。您还在寻找子字符串或完全匹配吗?
    • 我的目标是输出Publications with viral or virus in the title: [List of publications with viral or virus in the title]。我正在尝试获得完全匹配。
    • @user3723011,然后使用最后一个正则表达式
    • 我试过这样做,但我仍然得到一个空白输出。 titles = [] # start with empty list of titles for record in records: ti_list = record['TI'] #titles r = re.compile("vir(al|us)") if r.search(title) and title not in titles: titles.append(title) 替换我代码中倒数第二个块。仍然没有运气。也许我没有正确添加它。
    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多