Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 找到路径的根_Python_Regex - Fatal编程技术网

Python 找到路径的根

Python 找到路径的根,python,regex,Python,Regex,我有一条路: path = foo/bar/baz 我想确定基数是多少。在本例中,它应该返回“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 = foo/bar/baz
我想确定基数是多少。在本例中,它应该返回“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)

如果我理解这些要求,您希望该目录脱离根目录,除非它是相对路径,否则您希望该目录脱离您所属的任何位置?你找不到一个内置函数来处理这样的事情。但如果这真的是你需要的,那就用你的第二种“方式”。但是我会使用os.path.sep而不是“/”。

来获取路径所属的根目录的子目录-一个“基本”目录:

p = os.path
unc, rest = getattr(p, 'splitunc', lambda s: ('', s))(p.abspath(path))
drive, rest = p.splitdrive(rest)
basedir = p.join(unc, drive, p.sep, rest and rest.split(p.sep, 2)[1])

在Unix上,代码可以简化:
splitunc()
splitdrive()
可以省略。

如果您正在寻找一个能完全满足您需要的内置函数或stdlib函数,则没有

如果您正在寻找第三方库,请尝试搜索PyPI和ActiveState。您会发现路径操纵库,如(自Python 3.4以来就包含了该库)和(都基于早期的库,该库的一个修改版本曾被考虑过,但从未被纳入Python 2中),等等。(或者,如果您使用的是像
twisted
PyQt
这样的框架,它可能附带一个内置框架。)

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

pathlib.Path(mypath).parts[0]
Unipath.Path(mypath).split_root()[0]
Unipath.Path(mypath).components()[0]
path.path(mypath).splitall()[0]
他们对“根”的定义可能与你的定义不完全相同。(正如J.F.Sebastian指出的,我们实际上不知道您对“根”的确切定义,因此很难猜测它是否匹配……)因此,您可能仍然需要这种代码:

components = path.path(mypath).splitall()[0]
return components[0] if len(components[0]) > 1 else components[0]/components[1]
但不管怎样,它都比执行regexp和字符串操作要好


(事实上,即使您不使用第三方库,您也应该尝试使用
os.path
函数而不是字符串函数来构建所有内容,这样,当您明年在Windows上尝试它时,它很有可能会开箱即用,如果不使用,可能只需要一些小的更改,而不是绝对保证。)d它不起作用,可能需要完全重写。)

一行程序
os.path.splitdrive(checkedpath)[0]
类似于Peter的回答:

root = path.lstrip(os.sep).split(os.sep)[0]

为什么在这种情况下它不应该只返回
/
?你能定义一下你所说的基吗?
os.path.join(os.path.sep,/foo/bar/baz.split(os.path.sep)[1])
?你是在寻找
os.path.dirname(os.path.dirname(x))
?当它与POSIX中“basename”通常的意思完全相反时,就叫它“base”(还有Python等等)有点让人困惑。即使可以说是POSIX最初让人困惑,但到目前为止,这是一种标准做法,你不应该与之抗争。你能提供更多的例子吗。你想得到什么:
“foo”
“/foo”
“foo/”,
“/foo”
“/foo/”,
“/foo/bar”
“./bar”
“/../bar”
(注意:前导斜杠),
“foo/./bar”
“/”
(根目录),
(可能指当前目录)?我不是在寻找操作系统根目录,如果我没有说清楚,很抱歉。此路径可能指向另一台计算机。@实践一:对于Windows样式的路径,unc
可能指向另一台计算机。对于Unix样式的路径,
/
始终是根目录。来自不同主机的资源装载在它下面,即,它们也有他通常的结构:
/some/path/
。我编辑了我的需求,我想要的只是根目录(而不是OS根目录)。我认为OS.path.sep也可以工作。还有。。@J.F.Sebastian:谢谢。我必须仔细阅读这篇文章(我猜它与两年前Jason Orendorff写的一篇被Python拒绝的文章大致相似),但我会将其合并到我的答案中。@abarnert“如果您正在寻找一个能完全满足您需要的内置函数或stdlib函数,那么就没有了。”这就是我所需要知道的……我将把os.path函数分组。@J.F.Sebastian:简单地看一下,我喜欢它融合了Orendorff设计中最好的部分,以一种干净的方式处理NT/Posix分区(所以你可以考虑,但不必考虑),并不像早期基于Orendorff设计的PEP 355那样尝试在阳光下做任何事情。除非我必须处理Python 2.6或更早版本,否则如果我是OP,我可能会使用它,所以我将它移到示例列表的顶部。这应该是公认的答案,似乎不需要库,因为它可以用一行程序解决不适用于python3.4?on-liner返回一个空字符串?您的路径可能以“/”开头。我已经编辑了答案。
>>> 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'
root = path.lstrip(os.sep).split(os.sep)[0]