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)