Tekenreeks splitsen met meerdere scheidingstekens in Python

Ik heb online wat antwoorden gevonden, maar ik heb geen ervaring met reguliere expressies, wat hier volgens mij nodig is.

Ik heb een string die moet worden gesplitst door een ‘;’ of ‘, ‘
Dat wil zeggen, het moet een puntkomma of een komma zijn gevolgd door een spatie. Individuele komma’s zonder spaties moeten onaangeroerd blijven

Voorbeeld string:

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

moet worden opgesplitst in een lijst met het volgende:

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

Antwoord 1, autoriteit 100%

Gelukkig heeft Python dit ingebouwd 🙂

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

Update:
Na uw opmerking:

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

Antwoord 2, autoriteit 35%

Voer een str.replace('; ', ', ')uit en vervolgens een str.split(', ')


Antwoord 3, autoriteit 14%

Hier is een veilige manier voor elk itereerbaar scheidingsteken, met behulp van reguliere expressies:

>>> 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.escapemaakt het mogelijk om het patroon automatisch en laat de scheidingstekens netjes ontsnappen.

Hier is deze oplossing als een functie voor uw kopieer-plakplezier:

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

Als je vaak gaat splitsen met dezelfde scheidingstekens, compileer dan vooraf je reguliere expressie zoals beschreven en gebruik RegexObject.split.


Als je de originele scheidingstekens in de tekenreeks wilt laten staan, kun je de regex wijzigen om een achterkant beweringin plaats daarvan:

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (c) is awesome... isn't it?"
>>> regexPattern = '|'.join('(?<={})'.format(re.escape(delim)) for delim in delimiters)
>>> regexPattern
'(?<=a)|(?<=\\.\\.\\.)|(?<=\\(c\\))'
>>> re.split(regexPattern, example)
['sta', 'ckoverflow (c)', ' is a', 'wesome...', " isn't it?"]

(vervang ?<=met ?=om de delimiteurs aan de rechterkant te bevestigen, in plaats van links)


Antwoord 4, Autoriteit 8%

In reactie op het antwoord van Jonathan hierboven lijkt dit alleen voor bepaalde scheidingstekens te werken. Bijvoorbeeld:

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

Door de delimiteurs in vierkante beugels te plaatsen lijkt het effectiever te werken.

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

Antwoord 5, Autoriteit 3%

Dit is hoe de regex eruit ziet:

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)

Other episodes