2014-03-07 62 views
1

我正在使用python。我的问题是我有几个字符串,我必须检测他们的哪一部分看起来像一条路径,然后规范化那些实际路径。
例如我有几个不同的字符串喜欢如下:
1. .. \ .. \ .. \工作区
2. C:\源\工作区
3. -B .. \ .. \源
4. - 建立.. \ .. \工作\源.. \工作区
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('.'):]。但是这不是一般化和不酷的。所以我正在寻找更好的算法或解决方案。

+0

的是're.split'甚或'str.split'什么 –

+0

分裂?拆分需要拆分一些字符 – tejas

+0

您无法检测路径名。例如,在linux上,路径允许包含除'\ 0'之外的任何字符。唯一被处理的字符是'\ 0',因为这会终止字符串,而'/'被用作路径分量分隔符,但这后一个事实并不重要/帮助... – pasztorpisti

回答

0

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

如果我们用一些合理的猜测去,我能想到的是这样的:

  • 如果不下手 - ,这是一个路径
  • 如果它开始 - ,删除第一信和使用os.path。存在于其余部分,如果返回true,则直到你得到非字母数字字符

某些情况下,这打破了,你有路径之上

  • 重复:

    • 我们真的有一个路径,但它并没有在文件系统
    • 存在不妨多吃的驱动器盘符,并检查错误的驱动器
    • 上存在的路径,如果选项可以包含非字母数字字符
    • 参数是在当前目录
  • +0

    是的。考虑到它的窗口,这个算法在几个地方出现了问题,这是一个很难的问题。 – tejas

    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/

    希望帮助:)

    +0

    是我正在使用path = path [path.find(':') - 1:]代码示例2和5.以及其他人的路径=路径[path.find('。'):] – tejas

    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'。只要发送函数的任何这些字符串,它应该工作。祝你好运!在评论中提问。

    +0

    这个比我在这个问题中写的代码消耗更多的时间。 – tejas

    +0

    你正在寻求一个通用版本,这是一个回答你的问题。它适用于各种路径名称和类型,并不像您说的解决方案那样不酷。 –

    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)