查找string是否为路径

时间:2014-03-07 00:32:16

标签: python string path substring

我在python中工作。我的问题是我有几个字符串,我必须检测它们的哪一部分看起来像路径,然后规范化那些是实际路径。 例如
我有几个不同的字符串如下:
1。 .. \ .. \ .. \工作区
2。 C:\源\工作区
3。 -B .. \ .. \源
4。 -build .. \ .. \工作\源.. \工作区
5。 -HD:\ ABC \ BDS \工作区
基本上一些字符串是直接路径,有些字符串有尾随 - 附在它们上面。选项字符串的长度是可变的。
在上面的例子中,字符串3,4,5包含一个预先附加了选项-B,-build,-H的路径字符串。
问题是如何从上面的例子中检测出字符串的哪一部分是路径而哪部分不是。选项没有修复,所以我不能只检查给定字符串的头部预先指定的选项。
前进的唯一方法是从...开始或从前一个字符开始的子字符串:(例如C:或D :)。

所以问题是有没有任何通用的方法来做这个或者python是否提供任何函数来从任何特定位置开始截取字符串的截断部分?

满足上述5个例子的任何答案都很酷,即使它有点过度拟合。

我目前使用的代码,例如2和5是:path = path[path.find(':')-1:] 而对于其他人path = path[path.find('.'):]。但这不是一般化和不冷静的。所以我正在寻找更好的算法或解决方案。

4 个答案:

答案 0 :(得分:0)

如果您没有已知的选项列表,我认为您不能拥有100%可靠的算法。

如果我们采取一些合理的猜测,我可以想到这样的事情:

  • 如果它不以 - 开头,则是路径
  • 如果它以 - 开头,则删除第一个字母并在余数上使用os.path.exists,如果它返回true,那么你有路径
  • 重复上述内容,直至找到非字母数字字符

有些情况会发生故障:

  • 我们确实有一条路径,但它在文件系统中不存在
  • 我们可能会吃掉驱动器号,并检查路径是否存在于错误的驱动器上
  • 如果选项可以包含非字母数字字符
  • 参数是当前目录中的文件或文件夹

答案 1 :(得分:0)

是的,我认为你需要的工具是列表切片机制

我们初始化一个字符串:

string = "a/b/c/d"

如果我们想要访问例如第一个两个元素,那么我们会这样做:

sub_string = string[:2]

如果我们想要访问最后两个元素,那么我们将使用:

sub_string = string[-2:]

更多关于列表切片http://www.pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python/

希望有所帮助:)

答案 2 :(得分:0)

使用我创建的这个功能:

import os

string_1 = 'adsflk;ajewqpfoiewjqfpowijapfeiojC:\Python27'

def parse_path(string):
    count = 0
    while True:
        count += 1
        new_string = string.split(string[:count], 1)
        if os.path.exists(new_string[1]):
            return new_string
            break

使用parse_path运行string_1函数会返回'C:\Python27'。只需发送任何这些字符串的功能,它应该工作。祝好运!在评论中提问。

答案 3 :(得分:0)

这样的事情可以吗?

import os

possibles = [
"..\..\..\Workspace",
"C:\source\Workspace",
"-B..\..\source",
"-build..\..\work\source..\workspace",
"-HD:\abc\bds\Workspace "
]

paths = []
for p in possibles:
    if p[0] == '-':
        if ':' in p:
            p = p[p.index(':')-1:]
        else:
            cut = 2
            while not os.path.exists(p) and p:
                p = p[cut:]
                cut+=1
    if p: paths.append(p)