Split string dengan beberapa pembatas di Python

Saya menemukan beberapa jawaban secara online, tapi saya tidak punya pengalaman dengan ekspresi reguler, yang saya percaya adalah apa yang dibutuhkan di sini.

Aku punya string yang perlu dibagi dengan baik ';' atau ', ' Artinya, itu telah menjadi salah satu tanda titik koma atau koma diikuti dengan spasi. Individu koma tanpa spasi tambahan harus dibiarkan tak tersentuh

Contoh 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]"

harus dipecah ke dalam sebuah daftar yang berisi sebagai berikut:

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

Untungnya, Python memiliki built-in :)

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

Update:
Berikut komentar anda:

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

Melakukan str.mengganti('; ', ', ') dan kemudian str.split(', ')

Komentar (7)

Berikut ini's cara yang aman untuk setiap iterable dari pembatas, menggunakan ekspresi reguler:

>>> 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.melarikan diri memungkinkan untuk membangun pola secara otomatis dan memiliki pembatas melarikan diri baik-baik.

Berikut ini's solusi ini sebagai fungsi untuk copy-paste kesenangan:

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

Jika anda're akan membagi sering menggunakan pembatas, mengkompail ekspresi reguler anda terlebih dahulu seperti yang dijelaskan dan gunakan RegexObject.split.

Komentar (4)

Dalam menanggapi Jonathan's jawaban di atas, ini hanya tampaknya bekerja untuk beberapa pembatas. Misalnya:

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

Dengan menempatkan pembatas dalam kurung tampaknya untuk bekerja lebih efektif.

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

Ini adalah bagaimana regex terlihat seperti:

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)
Komentar (1)