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
相关产品推荐
相关产品推荐

