R语言拆分PubMed抓取数据中格式复杂的cite列
拆分PubMed爬取的cite字段为多列的解决方案
针对你爬取PubMed得到的cite字段格式不规整的问题,可以通过正则表达式定向提取的方式拆分目标字段,以下是R和Python的具体实现方案:
核心思路
观察cite字段的结构,各目标字段有明显的特征:
- 期刊名(Reference):字段开头到第一个
.的内容 - 出版日期(Date of publication):
4位年份 + 3字母月份的组合 - 页码(Page):
卷号(可选期号):起始页码-结束页码的格式 - doi:以
doi:开头的连续字符 - Epub日期:以
Epub开头的完整日期 - PMID:以
PMID:开头的数字串 - Review:若字段包含
Review关键词则标记为综述
R 实现(基于tidyverse)
# 加载依赖包 library(tidyverse) # 提取并清理各字段 result_cleaned <- result %>% # 提取原始内容 mutate( Reference = str_extract(cite, "^[^\\.]+\\."), `Date of publication` = str_extract(cite, "\\d{4} [A-Z][a-z]{2}"), Page = str_extract(cite, "\\d+(?:\\(\\d+\\))?:\\d+-\\d+"), doi = str_extract(cite, "doi: \\S+"), Epub = str_extract(cite, "Epub \\d{4} [A-Z][a-z]{2} \\d+"), PMID_cite = str_extract(cite, "PMID: \\d+"), Review = ifelse(str_detect(cite, "Review"), "Yes", "No") ) %>% # 清理多余前缀/标点 mutate( Reference = str_remove(Reference, "\\.$"), doi = str_remove(doi, "doi: "), Epub = str_remove(Epub, "Epub "), PMID_cite = str_remove(PMID_cite, "PMID: ") )
Python 实现(基于Pandas)
import pandas as pd import re # 定义各字段的正则匹配模式 pattern_map = { "Reference": r"^[^\.]+\.", "Date of publication": r"\d{4} [A-Z][a-z]{2}", "Page": r"\d+(?:\(\d+\))?:\d+-\d+", "doi": r"doi: \S+", "Epub": r"Epub \d{4} [A-Z][a-z]{2} \d+", "PMID_cite": r"PMID: \d+" } # 批量提取字段 for col_name, pattern in pattern_map.items(): result[col_name] = result["cite"].str.extract(pattern, expand=False) # 清理字段内容 result["Reference"] = result["Reference"].str.rstrip(".") result["doi"] = result["doi"].str.replace("doi: ", "", regex=False) result["Epub"] = result["Epub"].str.replace("Epub ", "", regex=False) result["PMID_cite"] = result["PMID_cite"].str.replace("PMID: ", "", regex=False) # 标记Review字段 result["Review"] = result["cite"].str.contains("Review").map({True: "Yes", False: "No"})
特殊情况处理
如果存在少量格式异常的cite条目,可以通过以下方式排查:
- 用
str_detect(R)或str.contains(Python)筛选出不匹配核心模式的记录 - 针对这类记录调整正则表达式,或者手动补全字段内容
内容的提问来源于stack exchange,提问作者Ileeo
相关产品推荐
相关产品推荐

