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

Python中如何用正则提取pubmed文件名数字?并高效筛选文件列表?

一次提取文件名中的数字部分

你可以用带捕获组的正则,一次替换就拿到中间的数字串,不用分两次操作。示例代码:

import re

# 编译正则,复用更高效
pattern = re.compile(r'^pubmed23n(\d+)\.xml\.gz$')
test_str = 'pubmed23n0001.xml.gz'
result = pattern.sub(r'\1', test_str)
# 输出结果:'0001'

原理很简单:(\d+)会精准捕获文件名中间的数字部分,替换时用\1引用这个捕获到的内容,直接把整个字符串替换成数字串,一步到位。

你之前尝试的正向/反向断言没用,是因为断言只匹配位置,不匹配具体内容——比如(?<=pubmed23n)只是匹配pubmed23n后面的位置,(?=\.xml\.gz)匹配.xml.gz前面的位置,但没法直接提取这两个位置之间的内容作为替换结果,必须靠捕获组来抓取目标内容。

更高效的筛选方法

如果要筛选掉数字小于指定值的文件,不用先处理所有文件名再找索引删除,直接遍历判断能减少不必要的操作,效率更高。

通用场景(列表未排序)

import re

filename_pattern = re.compile(r'^pubmed23n(\d+)\.xml\.gz$')

def filter_files(filename_list, keep_from: int):
    filtered = []
    for fname in filename_list:
        match = filename_pattern.match(fname)
        if match:
            num = int(match.group(1))
            if num >= keep_from:
                filtered.append(fname)
    return filtered

# 用法示例
filename_list = ['pubmed23n0001.xml.gz','pubmed23n0002.xml.gz','pubmed23n0003.xml.gz']
filtered_list = filter_files(filename_list, 2)
# 输出:['pubmed23n0002.xml.gz','pubmed23n0003.xml.gz']

优化场景(列表已按数字排序)

如果你的文件名列表已经是从小到大排序好的,还能进一步优化:找到第一个数字≥keep_from的位置,直接切片返回,不用遍历整个列表:

def filter_sorted_files(filename_list, keep_from: int):
    for idx, fname in enumerate(filename_list):
        match = filename_pattern.match(fname)
        if match and int(match.group(1)) >= keep_from:
            return filename_list[idx:]
    return []  # 所有文件都小于指定值时返回空列表

这种方法在找到第一个符合条件的元素后就停止遍历,处理几千个元素时速度会快很多。

另外,提前编译正则(re.compile)也能提升效率——正则只编译一次,后续多次匹配/替换都能复用,避免重复编译的开销。

内容的提问来源于stack exchange,提问作者jimmymcheung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:20:35