2017-08-06 7 views
3

J'ai une chaîne qui peut ou non avoir un séparateur | le brisant en deux parties distinctes.Déballage de tuple étendu avec format de chaîne inconnu

Est-il possible de le faire tuple étendu déballer comme ça

first_part, *second_part = 'might have | second part'.split(' | ') 

et ont second_part == 'second part' plutôt que ['second part']? S'il n'y a pas de séparateur, second_part devrait être ''.

+0

s'il n'y a pas un tel élément. Que devrait alors être «second_part»? –

+0

@WillemVanOnsem '' '' voir la réponse ci-dessous – Hatshepsut

+0

D'où vient la 'b == deuxième partie'? Et la '['deuxième partie']'? –

Répondre

4
first_part, _, second_part = 'might have | second part'.partition(' | ') 
2

Vous pouvez le faire comme ceci:

>>> a, b = ('might have | second part'.split(' | ') + [''])[:2] 
>>> a, b 
('might have', 'second part') 
>>> a, b = ('might have'.split(' | ') + [''])[:2] 
>>> a, b 
('might have', '') 

La bonne chose au sujet de cette approche est que ce qu'il est facilement généralisable à n-uplet (alors que partition ne fera que diviser en partie avant le séparateur, séparateur et la partie après):

>>> a, b, c = ('1,2,3'.split(',') + list("000"))[:3] 
>>> a, b, c 
('1', '2', '3') 
>>> a, b, c = ('1,2'.split(',') + list("000"))[:3] 
>>> a, b, c 
('1', '2', '0') 
>>> a, b, c = ('1'.split(',') + list("000"))[:3] 
>>> a, b, c 
('1', '0', '0') 
0

Vous pouvez essayer ceci:

s = 'might have | second part' 

new_val = s.split("|") if "|" in s else [s, ''] 

a, *b = new_val 
0

Il y a deux pièges ici:

  • Faire face à plusieurs seperators
  • ne cherche pas la chaîne deux fois (à savoir fractionnement une fois)

Donc, si vous ne souhaitez que diviser les premiers seperators (utilisation string.rsplit() pour les derniers seperators):

def optional_split(string, sep, amount=2, default=''): 
    # Split at most amount - 1 times to get amount parts 
    parts = string.split(sep, amount - 1) 
    # Extend the list to the required length 
    parts.extend([default] * (amount - len(parts))) 
    return parts 
first_part, second_part = optional_split('might have | second part', ' | ', 2)