You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则表达式获取Pandas DataFrame列中部分匹配的行索引

用正则匹配Pandas DataFrame中DOI对应的XML ID行

你要处理大型Pandas DataFrame,目标是把论文DOI和包含该DOI的XML文件名(也就是ScID.xml列)对应起来对吧?我来给你一步步拆解实现方法,结合你的数据表示例来演示。

先看你的数据表示例

你的DataFrame大概是这样的(补全了截断的行):

import pandas as pd

data = {
    'ScID.xml': [
        '0009-3570(2017)050[0199:omfg]2.3.co.xml',
        '0001-3568(2001)750[0199:smdhmf]2.3.co.xml',
        '0002-3568(2004)450[0199:gissaf]2.3.co.xml',
        '0003-3568(2011)150[0299:easayy]2.3.co.xml'
    ],
    'journal': ['Journal_1', 'Journal_3', 'Journal_1', 'Journal_2'],
    'year': [2017, 2001, 2004, 2011],
    'topic1': [0.000007, 0.000648, 0.000003, 0.000123]
}
df = pd.DataFrame(data)

核心实现步骤

假设你的测试DOI是0009-3570(2017)050(也就是第一行XML文件名的前缀部分),我们可以用正则快速定位匹配的行。

方法1:直接匹配包含目标DOI的XML文件名

因为DOI里包含括号这类正则特殊字符,所以先转义处理,避免解析错误:

import re

# 定义测试DOI
test_doi = '0009-3570(2017)050'
# 转义DOI中的特殊字符,生成正则匹配模式
pattern = re.escape(test_doi)
# 筛选出ScID.xml列包含该DOI的行
matching_rows = df[df['ScID.xml'].str.contains(pattern)]

# 查看结果
print(matching_rows)

运行后会直接返回第一行的完整数据,完美命中目标。

方法2:先提取XML中的DOI部分再匹配

如果需要批量提取所有XML文件名里的DOI片段,再和目标DOI匹配,可以用正则捕获组:

# 用正则捕获XML文件名中的DOI前缀部分(适配你的XML格式)
df['extracted_doi'] = df['ScID.xml'].str.extract(r'(^[\d-]+(\(\d{4}\)\d+))')[0]

# 筛选出提取的DOI和测试DOI一致的行
matching_rows = df[df['extracted_doi'] == test_doi]

这种方法适合需要先统一提取所有DOI,再做后续匹配或分析的场景。

针对大型DataFrame的优化提示

  • Pandas的str.contains()已经做了性能优化,处理百万级别的行也没问题;
  • 如果数据量特别大,可以预编译正则表达式,再用apply处理:
    compiled_pattern = re.compile(re.escape(test_doi))
    matching_rows = df[df['ScID.xml'].apply(lambda x: compiled_pattern.search(x) is not None)]
    
  • 如果你的DOI是标准格式(比如10.xxxx/xxxx),可以把正则改成标准DOI匹配模式:r'10\.\d{4,9}/[-._;()/:A-Z0-9]+'(DOI不区分大小写,可加re.IGNORECASE参数)。

内容的提问来源于stack exchange,提问作者Lorcán

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:39