регулярное выражение Python для удаления лишних символов из документа doi - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в 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)

, но оно ничего не делает.я искал во многих других вопросах переполнения стека, но не мог получить тот для моего случая.Пожалуйста, помогите мне здесь.

PS Я работаю с Python 3

1 Ответ

0 голосов
/ 19 декабря 2018

Предполагая, что шаблон для DOI - это подстрока, начинающаяся с 10. и более цифр, / и затем 1+ слова или . символов, вы можете сначала преобразовать строки, используя urlib.parse.unquote (для преобразования сущностей в литералыстрок), а затем используйте re.search с шаблоном \b10\.\d+/[\w.]+\b для извлечения каждого DOI из элементов списка:

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

Включитьпустые элементы при отсутствии совпадения добавьте условие else: new_doi_list.append("") к приведенному выше коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...