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?
This sort of 'stateful' splitting is a somewhat common task. If you're feeling creative, you could write itertools.splitby(iterable, separator_func)
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 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