如何使用re.findall提取/分隔路径的目录,支持//作为单个/字面量
正则提取路径分段解决方案
核心需求说明
- 将路径中连续的
/视为单个分隔符 - 开头的连续斜杠对应第一个分段为单个
/ - 仅通过正则相关方法实现,不直接使用
str.split处理
可行实现方案
方案1:先归一化再匹配(易读性高)
先把所有连续斜杠替换为单个,再提取分段:
import re path = '///a//b/c///d' # 归一化连续斜杠 normalized_path = re.sub(r'/+', '/', path) # 提取所有分段 segments = re.findall(r'^/|[^/]+', normalized_path) print(segments) # 输出:['/', 'a', 'b', 'c', 'd']
方案2:单次re.findall实现(无预处理步骤)
利用零宽断言和捕获组,一次匹配得到结果:
import re path = '///a//b/c///d' segments = [m[0] if m[0] else m[1] for m in re.findall(r'^(/)|(?<=/)([^/]+)', path)] print(segments) # 输出:['/', 'a', 'b', 'c', 'd']
原写法问题说明
你之前尝试的正则是将斜杠序列和后续文件名绑定捕获,所以会保留连续斜杠的完整内容。上述方案通过后行断言匹配斜杠作为分隔标记,不会将斜杠本身纳入文件名分段的捕获结果,自动跳过了连续重复的斜杠。
如果需要接近你示例中的['/', 'a/b', 'c/', 'd']格式,只需在得到基础分段后按照业务规则拼接相邻分段即可。
内容的提问来源于stack exchange,提问作者dstromberg
相关产品推荐
相关产品推荐

