给定路径,我需要提取特定命名的子目录(如果存在)之前的路径部分 - 我们将调用此停止器以在此问题中轻松识别它。
需要注意的是,路径可能以塞子开始或结束
输入/输出的一些示例对:
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)])
这有效并且似乎比正则表达式更简洁,但对我来说,我需要拆分字符串,然后根据值的索引拆分列表,然后将其连接在一起似乎很奇怪。我觉得这可以简化或改进。
另一个看似更有效和更简单的方法是使用itertools.takewhile
,它(来自文档)制作一个迭代器,只要谓词为真,它就会从可迭代对象中返回元素:
import os
from itertools import takewhile
def it_method(p, s):
return '/'.join(takewhile(lambda d : d != s, p.split('/')))
测试:
print(it_method('some/path/to/my/file.ext', 'my'))
print(it_method('some/path/to/my/file.ext', 'to'))
print(it_method('some/path/to/my/file.ext', 'some'))
print(it_method('some/path/to/to/my/file.ext', 'to'))
输出:
some/path/to
some/path
some/path
所以在这种情况下,它会一直生成目录名称,直到stopper
遇到。
谓词也可以缩短为s.__ne__
而不是使用lambda
函数:
def it_method(p,s):
return '/'.join(takewhile(s.__ne__, p.split('/')))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句