给定一个路径,我需要提取路径中位于指定子目录(如果存在)之前的部分—我们将称之为stopper,以便在这个问题中轻松识别它。你知道吗
应注意,路径可以以止动块开始或结束
一些输入/输出示例对:
path = 'some/path/to/my/file.ext'
# ends with stopper
stopper = 'my'
result = 'some/path/to'
# begins with stopper
stopper = 'some'
result = ''
# stopper in middle
stopper = 'to'
result = 'some/path'
# special case - should stop at first stopper location
path = 'path/to/to/my/file.ext'
stopper = 'to'
result = 'path'
我设计了两种获得答案的方法:
import re
# p = path; s = stopper
def regex_method(p,s):
regex = r"(?:(?!(?:^|(?<=/))" + s + r").)+(?=/)"
m = re.match(regex, p)
if m:
return m.group()
return ''
这是可行的,但根据通过的止动块值,很容易出现故障-不适合在生产中使用。你知道吗
import os
# p = path; s = stopper
def os_method(p,s):
parts = os.path.dirname(p).split('/')
return '/'.join(parts[:parts.index(s)])
这一点很有效,似乎比regex的对应项更简洁,但我觉得奇怪的是,我需要拆分字符串,然后根据值的索引拆分列表,然后将其连接在一起。我觉得这个可以简化或者改进。你知道吗
可以在生成器上使用^{} 模块和
next
,如下所示:我建议使用
pathlib
:以您的例子:
path = Path('some/path/to/my/file.ext'
)输出:
PosixPath('some/path/to')
输出:
PosixPath('.')
输出:
PosixPath('some/path')
另一种似乎更有效、更简单的方法是使用^{} ,它(从文档中)生成一个迭代器,只要谓词为true,它就从iterable返回元素:
测试:
输出:
因此在本例中,它会一直生成目录名,直到遇到
stopper
。你知道吗谓词也可以缩短为
s.__ne__
,而不是使用lambda
函数:相关问题 更多 >
编程相关推荐