求助:Python正则表达式替换适配多格式文件名的正确写法
正则表达式处理文件名问题解决
问题背景
需要用Python正则表达式处理文件名,现有代码仅支持包含_[0-9]*模式的输入,无法适配不含该模式的场景,目标是让以下三种输入都得到统一的期望输出:
- 输入:
usa_t1_usq_t1_[0-9]*.csv→ 期望输出:usa_t1_usq_t1 - 输入:
usa_t1_usq_t1_[0-9]*.gzip.csv→ 期望输出:usa_t1_usq_t1 - 输入:
usa_t1_usq_t1.gzip.csv→ 期望输出:usa_t1_usq_t1
现有代码:
import re Country_name = "usa_t1_usq_t1_[0-9]*.csv" new_result = re.sub(r'(?:_[[0-9-]+].*[a-zA-Z])+', '', Country_name) # Display the Content print(new_result)
解决方案
这里提供两种可行的正则表达式方案,都能适配所有场景:
方案1:替换需要移除的后缀部分
使用正则匹配两种后缀模式(含_[0-9]*的后缀或直接以.开头的后缀),替换为空字符串即可:
import re test_cases = [ "usa_t1_usq_t1_[0-9]*.csv", "usa_t1_usq_t1_[0-9]*.gzip.csv", "usa_t1_usq_t1.gzip.csv" ] # 正则解释:匹配以_[0-9]*开头的任意内容,或以.开头的任意内容 pattern = r'(?:_[0-9]*|\.)\S+' for case in test_cases: result = re.sub(pattern, '', case) print(f"输入: {case} → 输出: {result}")
方案2:提取目标前缀部分
通过正则匹配并提取目标前缀(直到遇到_[0-9]*或.为止):
import re test_cases = [ "usa_t1_usq_t1_[0-9]*.csv", "usa_t1_usq_t1_[0-9]*.gzip.csv", "usa_t1_usq_t1.gzip.csv" ] # 正则解释:从开头匹配任意内容(非贪婪),直到遇到_[0-9]*或. pattern = r'^(.+?)(?:_[0-9]*|\.)' for case in test_cases: match_result = re.search(pattern, case) if match_result: print(f"输入: {case} → 输出: {match_result.group(1)}")
两种方案运行后都会输出符合预期的结果。
内容的提问来源于stack exchange,提问作者BigD
相关产品推荐
相关产品推荐

