chirayuk wrote:


However, I just realized that the following is also a valid PATH in windows.


PATH=c:\A"\B;C"\D;c:\program files\xyz" (The quotes do not need to cover the entire path)

Too bad! What a crazy format!

So here is my handcrafted solution.

def WinPathList_to_PyList (pathList):
    pIter = iter(pathList.split(';'))
    OddNumOfQuotes = lambda x: x.count('"') % 2 == 1
    def Accumulate (p):
        bAcc, acc = OddNumOfQuotes(p), [p]
        while bAcc:
            p = pIter.next ()
            acc.append (p)
            bAcc = not OddNumOfQuotes (p)
        return "".join (acc).replace('"','')
    return [q for q in [Accumulate (p) for p in pIter] if q]

Does it work?

I get:
 >>> test2 = r'c:\A"\B;C"\D;c:\program files\xyz"'
 >>> WinPathList_to_PyList(test2)
 Traceback (most recent call last):
   File "<input>", line 1, in ?
   File "pathsplit", line 31, in WinPathList_to_PyList
   File "pathsplit", line 27, in Accumulate
 StopIteration
 >>>

Also, on the old test case, I get:
 >>> WinPathList_to_PyList("""\"c:\\A;B";c:\\D;""")
 ['c:\\AB', 'c:\\D']
 >>>

Should the ';' within the quotes be removed?


So now I need to check if the os is windows.

Wishful thinking: It would be nice if something like this (taking care
of the cases for other OS's) made it into the standard library - the
interpreter must already be doing it.

This sort of 'stateful' splitting is a somewhat common task. If you're feeling creative, you could write itertools.splitby(iterable, separator_func)

This would be a sister function to itertools.groupby (and possible derive from its implementation). separator_func is a callable that returns True if the item is a separator, False otherwise.

splitby would return an iterator of sub-iterators (like groupby) defined by the items between split points

You could then implement parsing of crazy source like your PATH variable by implementing a stateful separator_func

Michael

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to