String splitting with exceptions

wxjmfauth at gmail.com wxjmfauth at gmail.com
Thu Aug 29 03:26:26 EDT 2013


Le mercredi 28 août 2013 18:44:53 UTC+2, John Levine a écrit :
> I have a crufty old DNS provisioning system that I'm rewriting and I
> 
> hope improving in python.  (It's based on tinydns if you know what
> 
> that is.)
> 
> 
> 
> The record formats are, in the worst case, like this:
> 
> 
> 
> foo.[DOM]::[IP6::4361:6368:6574]:600::
> 
> 
> 
> What I would like to do is to split this string into a list like this:
> 
> 
> 
> [ 'foo.[DOM]','','[IP6::4361:6368:6574]','600','' ]
> 
> 
> 
> Colons are separators except when they're inside square brackets.  I
> 
> have been messing around with re.split() and re.findall() and haven't
> 
> been able to come up with either a working separator pattern for
> 
> split() or a working field pattern for findall().  I came pretty
> 
> close with findall() but can't get it to reliably match the
> 
> nothing between two adjacent colons not inside brackets.
> 
> 
> 
> Any suggestions? I realize I could do it in a loop where I pick stuff
> 
> off the front of the string, but yuck.
> 
> 
> 
> This is in python 2.7.5.
> 
> 
> 
> -- 
> 
> Regards,
> 
> John Levine, johnl at iecc.com, Primary Perpetrator of "The Internet for Dummies",
> 
> Please consider the environment before reading this e-mail. http://jl.ly

----------

Basic idea: protect -> split -> unprotect

>>> s = 'foo.[DOM]::[IP6::4361:6368:6574]:600::'
>>> r = s.replace('[IP6::', '***')
>>> a = r.split('::')
>>> a
['foo.[DOM]', '***4361:6368:6574]:600', '']
>>> a[1] = a[1].replace('***', '[IP6::')
>>> a
['foo.[DOM]', '[IP6::4361:6368:6574]:600', '']

jmf



More information about the Python-list mailing list