Python中如何使用re正则从完整文件路径提取文件名?
解答
非贪婪匹配?的实际逻辑
非贪婪模式不是全局寻找最短匹配,其运行逻辑遵循正则从左到右扫描的基本规则:在当前位置启动匹配后,在保证整个正则表达式能匹配成功的前提下,让对应量词修饰的部分尽可能少匹配字符。
你写的r"/.*?$"执行时,会先定位到字符串中第一个/的位置,之后.*?虽然倾向于少匹配字符,但由于表达式末尾绑定了字符串结束锚点$,如果.*?在中间任意一个/位置停止匹配,剩余部分无法满足$的匹配要求,因此只能一直向后匹配到字符串末尾,最终返回第一个/后的全部内容,和预期不符。
可实现需求的正则写法
不需要依赖非贪婪模式,两种稳定正则写法即可提取文件名:
- 利用贪婪匹配特性:
开头的import re path = "/root/projects/demo/main.py" filename = re.match(r".*/(.*)", path).group(1) # 返回结果: main.py.*为贪婪模式,会尽可能多匹配字符,直到碰到字符串中最后一个/才停止,后续的(.*)会捕获最后一个/后的全部内容,也就是目标文件名。 - 匹配末尾非分隔符序列:
filename = re.search(r"[^/]+$", path).group() # 返回结果: main.py[^/]匹配所有非/字符,结合末尾锚点$,直接匹配到字符串末尾最长的一段不含/的内容,无需捕获分组即可拿到文件名。
更推荐的非正则实现
生产环境处理路径不建议使用正则,Python标准库自带的路径工具已经覆盖了跨平台、末尾带斜杠等边缘场景,稳定性更高:
- 兼容全Python版本的
os.path方案:
如果路径末尾存在多余斜杠(如import os filename = os.path.basename(path)/root/projects/demo/),可先预处理再取值:filename = os.path.basename(path.rstrip(os.sep)) - Python3.4+可用的现代
pathlib方案:from pathlib import Path filename = Path(path).name
内容的提问来源于stack exchange,提问作者sauron379
相关产品推荐
相关产品推荐

