2011-01-14 3 views
7

В Python я хотел бы разбить строку, используя список разделителей. Сепараторы могут быть либо запятыми, либо точкой с запятой. Пробел должен быть удален, если он не находится в середине не-пробельных, несепараторных символов, и в этом случае он должен быть сохранен.Python: Разделить строку по списку разделителей

Тестовый пример 1: ABC,DEF123,GHI_JKL,MN OP
Тестовый пример 2: ABC;DEF123;GHI_JKL;MN OP
Тестовый пример 3: ABC ; DEF123,GHI_JKL ; MN OP

Походит случае регулярных выражений, что это хорошо, но если это проще и чище, чтобы сделать это по-другому это было бы еще лучше.

Спасибо!

ответ

15

Это должно быть гораздо быстрее, чем регулярное выражение, и вы можете передать список сепаратора обеспечивают, как вы хотели:

def split(txt, seps): 
    default_sep = seps[0] 

    # we skip seps[0] because that's the default seperator 
    for sep in seps[1:]: 
     txt = txt.replace(sep, default_sep) 
    return [i.strip() for i in txt.split(default_sep)] 

Как использовать: тест

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';')) 
['ABC', 'DEF123', 'GHI_JKL', 'MN OP'] 

Производительность:

import timeit 
import re 


TEST = 'ABC ; DEF123,GHI_JKL ; MN OP' 
SEPS = (',', ';') 


rsplit = re.compile("|".join(SEPS)).split 
print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)])) 
# 1.6733491150007467 

print(timeit.timeit(lambda: split(TEST, SEPS))) 
# 1.6442800510003508 
+1

Очень приятно. Должны выбрать это как лучший ответ. Спасибо всем! – blah238

+0

SO уплотняет пробелы, в строке выше более двух последовательных пробелов – fabrizioM

+0

К счастью, всегда будет запятая или точка с запятой. – blah238

5

Использование регулярных выражений, попробуйте

[s.strip() for s in re.split(",|;", string)] 

или

[t.strip() for s in string.split(",") for t in s.split(";")] 

без.

+0

Скорее сделайте это с помощью 'split()' строки, чтобы избежать импорта 're', например. '' ABC, DEF123, GHI_JKL, MN OP'.split (', |;') ' – marcog

+1

@macrog: Разве это не разделило бы строку во всех дословных вхождениях' ', |;" '? –

+0

Отлично работает! Спасибо :) – blah238

0
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf') 
['a', 'b', 'cdf'] 
0

Принимая во внимание e выше ответа, с вашими тестовыми примерами, вы хотите использовать регулярное выражение и один или несколько символов. В вашем случае символы разделения выглядят как ',', '|', ';' и пробелы. Пробелы в питона «\ ш», так что понимание является:

import re 
list = [s for s in re.split("[,|;\W]+", string)] 

Я не могу ответить на Свена ответить выше, но я разделить на один или несколько символов в скобках, и не должны использовать метод strip().

Yikes, я не правильно прочитал вопрос ... Ответ Свена с полосой работает; мой предполагает, что пробел - это еще одно разделение.

Смежные вопросы