找到路径的根

The*_*One 8 python regex

我有一条路:

path = foo/bar/baz
Run Code Online (Sandbox Code Playgroud)

我想确定基础是什么.在这个例子中,它应该返回"foo".

我尝试过几种方法:

root = re.search('(.+?)/(.+)', path).group(1)

paths = path.split('/')[0]
root = paths[0] if paths[0] or len(paths) <= 1 else '/'.join(paths[0:2])

def rootname(path):
  head,tail = os.path.split(path)
  if head != '':
   return rootname(head)
  else:
   return path
root = rootname(path)
Run Code Online (Sandbox Code Playgroud)

是否有更"Pythonic"的方式来访问根目录?

root = os.path.''rootname''(path)
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 14

>>> import os
>>> path = '/foo/bar/baz'
>>> path = path.lstrip(os.sep)  # Get rid of leading "/" if any
>>> root = path[:path.index(os.sep)] if os.sep in path else path
>>> root
'foo'
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 3

如果您正在寻找能够完全满足您需求的内置函数或 stdlib 函数,那么没有。

\n\n

如果您正在寻找第三方库,请尝试搜索 PyPI 和 ActiveState。您会发现路径操作库,例如pathlib(自 Python 3.4 起就包含在内)Unipathforked-path(均基于早期库,其修改版本曾被考虑但从未被接受包含在 Python 2 中),以及其他数十个库。(或者,如果您使用的是类似twistedPyQt,它可能会内置一个框架。)

\n\n

使用这样的库,通常可以在一行中获取根路径,例如:

\n\n
pathlib.Path(mypath).parts[0]\nUnipath.Path(mypath).split_root()[0]\nUnipath.Path(mypath).components()[0]\npath.path(mypath).splitall()[0]\n
Run Code Online (Sandbox Code Playgroud)\n\n

他们对“root”的定义可能与您的不完全相同。(正如 JF Sebastian 指出的,我们实际上并不确切地知道你对“root”的定义是什么,所以很难猜测它是否会匹配 \xe2\x80\xa6)所以,你可能仍然需要这个代码类型:

\n\n
components = path.path(mypath).splitall()[0]\nreturn components[0] if len(components[0]) > 1 else components[0]/components[1]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但无论如何,它都会比执行正则表达式和字符串操作更好。

\n\n

(事实上​​,即使你使用第三方库,你也应该尝试用os.path函数而不是字符串函数\xe2\x80\x94来构建所有内容,这样,当你明年在 Windows 上尝试时,就会有\这是一个很好的机会,它可以开箱即用,如果不是,它可能只需要进行微小的更改,而不是绝对保证它不会工作,并且可能需要完全重写。)

\n

  • [`pathlib` 模块定义了 `.parts` 属性](https://pathlib.readthedocs.org/en/latest/#accessing-individual-parts)。[pep 428 将其包含在 Python 3.4 中](http://www.python.org/dev/peps/pep-0428/)。 (2认同)