web-dev-qa-db-fra.com

Fractionner une chaîne avec plusieurs délimiteurs dans Python

J'ai trouvé des réponses en ligne, mais je n'ai aucune expérience des expressions régulières, ce qui, à mon avis, est nécessaire ici.

J'ai une chaîne qui doit être divisée par un ';' ou ',' C'est-à-dire qu'il doit s'agir d'un point-virgule ou d'une virgule suivi d'un espace. Les virgules individuelles sans espaces de fin ne doivent pas être modifiées

Exemple de chaîne:

"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 divisé 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]') 
407
gt565k

Heureusement, Python possède cette fonction intégrée :)

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

Mise à jour:
Suite à votre commentaire:

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

Faites une str.replace('; ', ', ') puis une str.split(', ')

175
Joe

Voici un moyen sûr pour tous les délimiteurs, à l'aide d'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 motif automatiquement et d’éviter les délimiteurs.

Voici cette solution en fonction de 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 envisagez souvent de scinder en utilisant les mêmes délimiteurs, compilez au préalable votre expression régulière comme décrit et utilisez RegexObject.split .

90
Kos

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 mettant les délimiteurs entre crochets, cela semble fonctionner plus efficacement.

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

Voici à quoi ressemble la 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)
27
Jochen Ritzel