Python: Split string avec plusieurs délimiteurs [dupliquer]

cette question a déjà une réponse ici:

  • la Scission de Chaînes avec Plusieurs Séparateurs? 29 réponses

j'ai trouvé quelques réponses en ligne, mais je n'ai aucune expérience avec les expressions régulières, qui je crois est ce qui est nécessaire ici.

j'ai une chaîne qui doit être divisé par un ';' ou ', ' C'est, il doit être un point-virgule ou une virgule suivie d'un espace. Les virgules individuelles sans espace de fuite doivent être laissées intactes

exemple de chaîne de caractères:

"b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3], mesitylene [000108-67-8]; polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]"

doit être scindé en une liste contenant les éléments suivants:

('b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3]' , 'mesitylene [000108-67-8]', 'polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]') 
316
demandé sur gt565k 2011-02-15 02:42:13

5 réponses

heureusement, Python a ceci intégré:)

import re
re.split('; |, ',str)

Update:

suivant votre commentaire:

>>> a='Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n',a)
['Beautiful', 'is', 'better', 'than', 'ugly']
534
répondu Jonathan 2011-09-20 10:46:45

Faire un str.replace('; ', ', ') puis un str.split(', ')

128
répondu Joe 2011-02-14 23:47:47

voici un moyen sûr pour tout itérable de délimiteurs, en utilisant des expressions régulières:

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (c) is awesome... isn't it?"
>>> regexPattern = '|'.join(map(re.escape, delimiters))
>>> regexPattern
'a|\.\.\.|\(c\)'
>>> re.split(regexPattern, example)
['st', 'ckoverflow ', ' is ', 'wesome', " isn't it?"]

re.escape permet de construire le modèle automatiquement et avoir les délimiteurs échappés bien.

voici cette solution comme une fonction pour votre plaisir de copier-coller:

def split(delimiters, string, maxsplit=0):
    import re
    regexPattern = '|'.join(map(re.escape, delimiters))
    return re.split(regexPattern, string, maxsplit)

si vous allez vous diviser souvent en utilisant les mêmes délimiteurs, compilez votre expression régulière à l'avance comme description et utilisation RegexObject.split .

71
répondu Kos 2013-02-28 17:54:29

en réponse à la réponse de Jonathan ci-dessus, cela ne semble fonctionner que pour certains délimiteurs. Par exemple:

>>> a='Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n',a)
['Beautiful', 'is', 'better', 'than', 'ugly']

>>> b='1999-05-03 10:37:00'
>>> re.split('- :', b)
['1999-05-03 10:37:00']

en plaçant les délimiteurs entre crochets, il semble fonctionner plus efficacement.

>>> re.split('[- :]', b)
['1999', '05', '03', '10', '37', '00']
41
répondu Paul 2013-01-09 10:22:43

voici à quoi ressemble le regex:

import re
# "semicolon or (a comma followed by a space)"
pattern = re.compile(r";|, ")

# "(semicolon or a comma) followed by a space"
pattern = re.compile(r"[;,] ")

print pattern.split(text)
22
répondu Jochen Ritzel 2011-02-14 23:52:13