it-swarm.com.de

Zeichenfolge mit mehreren Begrenzern in Python teilen

Ich habe einige Antworten online gefunden, aber ich habe keine Erfahrung mit regulären Ausdrücken, die meiner Meinung nach hier benötigt werden.

Ich habe eine Zeichenfolge, die durch ein ';' oder ',' Das heißt, es muss entweder ein Semikolon oder ein Komma gefolgt von einem Leerzeichen sein. Einzelne Kommas ohne Leerzeichen sollten unberührt bleiben

Beispielstring:

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

sollte in eine Liste aufgeteilt werden, die Folgendes enthält:

('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

Zum Glück hat Python dieses eingebaut :)

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

pdate:
Nach Ihrem Kommentar:

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

Mach eine str.replace('; ', ', ') und dann eine str.split(', ')

175
Joe

Hier ist eine sichere Methode für alle Trennzeichen, die reguläre Ausdrücke verwenden:

_>>> 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 ermöglicht es, das Muster automatisch zu erstellen und die Begrenzer gut zu maskieren.

Hier ist diese Lösung als Funktion für Ihr Vergnügen beim Einfügen von Kopien:

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

Wenn Sie häufig mit denselben Trennzeichen trennen, kompilieren Sie Ihren regulären Ausdruck wie beschrieben und verwenden Sie RegexObject.split .

90
Kos

Als Antwort auf Jonathans Antwort oben scheint dies nur für bestimmte Begrenzer zu funktionieren. Zum Beispiel:

>>> 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']

Wenn Sie die Begrenzer in eckige Klammern setzen, scheint dies effektiver zu funktionieren.

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

So sieht der reguläre Ausdruck aus:

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