Python: разбить строку по списку разделителей - PullRequest
8 голосов
/ 15 января 2011

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

Контрольный пример 1: ABC,DEF123,GHI_JKL,MN OP
Контрольный пример 2: ABC;DEF123;GHI_JKL;MN OP
Контрольный пример 3: ABC ; DEF123,GHI_JKL ; MN OP

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

Спасибо!

Ответы [ 4 ]

18 голосов
/ 15 января 2011

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

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
5 голосов
/ 15 января 2011

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

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

или

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

без.

1 голос
/ 15 января 2011

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

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

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

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

0 голосов
/ 15 января 2011
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf')
['a', 'b', 'cdf']
...