Wie Ignacio sagt, ja, aber nicht trivial in einem Rutsch. Das Problem ist, dass Sie Lookback müssen, um festzustellen, ob Sie an einem entflohenen Begrenzer sind oder nicht, und die grundlegenden string.split
bieten nicht die Funktionalität.
Wenn dies nicht innerhalb einer engen Schleife liegt, ist die Leistung kein wesentliches Problem. Sie können dies tun, indem Sie zuerst die maskierten Trennzeichen aufteilen, dann die Teilung durchführen und dann zusammenführen. Hässliche Demo-Code folgt:
# Bear in mind this is not rigorously tested!
def escaped_split(s, delim):
# split by escaped, then by not-escaped
escaped_delim = '\\'+delim
sections = [p.split(delim) for p in s.split(escaped_delim)]
ret = []
prev = None
for parts in sections: # for each list of "real" splits
if prev is None:
if len(parts) > 1:
# Add first item, unless it's also the last in its section
ret.append(parts[0])
else:
# Add the previous last item joined to the first item
ret.append(escaped_delim.join([prev, parts[0]]))
for part in parts[1:-1]:
# Add all the items in the middle
ret.append(part)
prev = parts[-1]
return ret
s = r'http\://www.example.url:ftp\://www.example.url'
print (escaped_split(s, ':'))
# >>> ['http\\://www.example.url', 'ftp\\://www.example.url']
Alternativ könnte es einfacher sein, die Logik zu folgen, wenn Sie nur die Zeichenfolge von Hand gespalten.
def escaped_split(s, delim):
ret = []
current = []
itr = iter(s)
for ch in itr:
if ch == '\\':
try:
# skip the next character; it has been escaped!
current.append('\\')
current.append(next(itr))
except StopIteration:
pass
elif ch == delim:
# split! (add current to the list and reset it)
ret.append(''.join(current))
current = []
else:
current.append(ch)
ret.append(''.join(current))
return ret
Beachten Sie, dass diese zweite Version etwas anders verhält, wenn es doppelt entkommen Begegnungen durch ein Trennzeichen gefolgt: Mit dieser Funktion kann Escape-Zeichen entkommen, so dass escaped_split(r'a\\:b', ':')
kehrt ['a\\\\', 'b']
, weil die ersten \
die zweite entweicht, den Abgang :
als reale Trennzeichen interpretiert werden. Das ist etwas, auf das man achten muss.
Ja, aber nicht trivial, ohne die Kriterien weiter einschränken. –
@ IgnacioVazquez-Abrams Welche Einschränkungen müssen angewendet werden, um es einfacher zu machen? –
Ich denke, ein Regex Split könnte damit kein Problem umgehen? http://docs.python.org/2/library/re.html –