Python正则表达式从论文的doi中删除多余的字符

时间:2018-12-19 07:58:17

标签: regex python-3.x

我是regex的新手,我列出了一些论文的DOI。一些DOI包含一些额外的字符或字符串。我想删除所有这些多余的东西。这是示例数据:

10.1038/ncomms3230
10.1111/hojo.12033
blog/uninews     #ivalid 
article/info%3Adoi%2F10.1371%2Fjournal.pone.0076852utm_source=feedburner&utm;_medium=feed&utm;_campaign=Feed%3A+plosone%2FPLoSONE+%28PLOS+ONE+Alerts%3A+New+Articles%29
#want to extract 10.1371/journal.pone.0076852
utm_source=feedburner&utm;_medium=feed&utm;_campaign=Feed%3A+plosone%2 #invalid
10.1002/dta.1578
enhanced/doi    #invalid
doi/pgen.1005204
doi:10.2135/cropsci2014.11.0791  # =want to remove "doi:"
10.1126/science.aab1052
gp/about-springer
10.1038/srep14556
10.1002/rcm.7274
10.1177/0959353515592899

现在某些条目根本没有DOI。我想用“”代替它们。 这是我想出的我的正则表达式:

for doi in doi_lst:
   doi = re.sub(r"^[^10\.][^a-z0-9//\.]+", "", doi)

但是它什么也没做。我在其他许多堆栈溢出问题中进行了搜索,但无法解决我的情况。请在这里帮助我。

P.s。我正在使用Python 3

1 个答案:

答案 0 :(得分:1)

假设DOI的模式是一个子字符串,其开头为10.和更多数字,/,然后是1+个单词或.字符,则可以使用{{1}转换字符串}(将实体转换为文字字符串),然后将urlib.parse.unquote\b10\.\d+/[\w.]+\b模式一起使用,以从列表项中提取每个DOI:

re.search

输出:

import re, urllib.parse
doi_list=["10.1038/ncomms3230", "10.1111/hojo.12033", "blog/uninews", "article/info%3Adoi%2F10.1371%2Fjournal.pone.0076852? ", "utm_source=feedburner&utm;_medium=feed&utm;_campaign=Feed%3A+plosone%2",
"10.1002/dta.1578", "enhanced/doi", "doi/pgen.1005204", "doi:10.2135/cropsci2014.11.0791", "10.1126/science.aab1052", "gp/about-springer", "10.1038/srep14556","10.1002/rcm.7274", "10.1177/0959353515592899"]
new_doi_list = []
for doi in doi_list:
    doi = urllib.parse.unquote(doi)
    m = re.search(r'\b10\.\d+/[\w.]+\b', doi)
    if m:
        new_doi_list.append(m.group())
        print(m.group())  # DEMO 

要在没有匹配项的情况下包括空项目,请在上述代码中添加10.1038/ncomms3230 10.1111/hojo.12033 10.1371/journal.pone.0076852 10.1002/dta.1578 10.2135/cropsci2014.11.0791 10.1126/science.aab1052 10.1038/srep14556 10.1002/rcm.7274 10.1177/0959353515592899 条件。