2012-06-15 1 views
0

Имея эту строку:Как разбить строку на python с несколькими разделителями?

Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 6:-231.617 

Я хочу хранить в массиве все, кроме сепараторов (' ',':-')

+1

Что именно вы хотите, чтобы содержимое массива было? Вы уверены, что не хотите '' '' s? Каково значение структуры данных? –

+0

@KarlKnechtel Я уверен, что я не хочу '' -''. 'array [0] == Breathing, array [1] == 1, array [2] == 31.145' и т. д. –

+0

сделал u пробовал регулярные выражения? –

ответ

2

Вы можете использовать str.split([sep[, maxsplit]])

Возвращает список слов в строке, используя sep в качестве строки разделителя. Если задано maxsplit, выполняется максимум maxsplit (таким образом, список будет иметь максимум maxsplit + 1 элемент). Если maxsplit не задано или -1, то нет ограничений на количество разделов (все возможные расщепления сделаны).

Applied

>> ' 1 2 3 '.split() 
['1', '2', '3'] 

в "тандеме" с str.replace(old, new[, count])

возвращает копию строки со всеми вхождений подстроки старого заменены новыми. Если задан параметр необязательного аргумента, заменяются только первые совпадения.

Applied

>>> a = 'h!e!l!l!o! w!o!r!l!d!' 
>>> a.replace('!','') 
'hello world' 

Применительно к вашему сценарию:

>> 'Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 
       12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 
       3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 
       6:-231.617'.replace(':-',' ').split(' ') 

['Breathing', '1', '31.145', '9', '32.8942', '13', '35.8225', '2', 
    '35.9872', '17', '36.2135', '16', '36.6343', '12', '36.7487', '4', '37.8538', 
    '8', '38.6924', '7', '39.0389', '14', '39.0697', '18', '40.0523', '3', 
    '40.5393', '15', '40.5825', '5', '41.6323', '11', '45.2976', 
    '10', '53.3063', '6', '231.617'] 

Все определения взяты из ручного

+0

Зачем использовать 'rsplit()' over 'split()'? –

+0

@Lattyware: просто туман :) – DonCallisto

+0

@acattle: лучше посмотри – DonCallisto

3

UPDATE: Я не понимаю, что Breathing была частью вас r данных. В этом случае вы получите все строки.

Предполагая:

b = 'Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872' 

тогда эта простая конструкция:

b.replace(':-',' ').split() 

даст:

['Breathing', '1', '31.145', '9', '32.8942', '13', '35.8225', '2', '35.9872'] 

Объяснение: он заменяет любой :- с пространством (' '). Затем он разбивает строку везде, где есть место, чтобы получить список строк.

Чтобы получить float значение для чисел:

['Breathing'] + [float(i) for i in b.replace(':-',' ').split()[1:]] 

приводит:

['Breathing', 1.0, 31.145, 9.0, 32.8942, 13.0, 35.8225, 2.0, 35.9872] 

Разъяснения: Похожая, как указано выше, за исключением того, float() используется на все числовые строки, чтобы преобразовать их для плавания и строка «Дыхание» помещается в начало списка.

+0

@ Levon ... где Дыхание? –

+3

Я думаю, вы имеете в виду 'b.replace (': -', '')'. Как бы то ни было, вы объединяете две цифры в одну. – acattle

+0

Хотя я признаю, что это может быть буквально то, что хочет OP, трудно поверить, что правильное обращение «1: -31.145» в «131.145» - это правильная вещь. – DSM

0
import re 
array=re.split(r'\s+|:-',mystring) 

В регулярном выражении, соответствует \s+ пробелы, тогда как :- соответствует этому последовательность литералов в строке. труба (|) - это способ повторения матча, если выполняется одно из этих условий.

Конечно, вы можете поменять на "\s" или даже " ", если хотите, чтобы вы разделились на одно место по вашему запросу.

4

re.split один простой способ сделать это - в этом случае, вы хотите разделить на наборе символов разделителей:

>>> import re 
>>> thestring = "Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 6:-231.617" 
>>> re.split(r"[ :\-]+", thestring) 
['Breathing', '1', '31.145', '9', '32.8942', '13', '35.8225', '2', '35.9872', '17', '36.2135', '16', '36.6343', '12', '36.7487', '4', '37.8538', '8', '38.6924', '7', '39.0389', '14', '39.0697', '18', '40.0523', '3', '40.5393', '15', '40.5825', '5', '41.6323', '11', '45.2976', '10', '53.3063', '6', '231.617'] 

[] определяет набор символов, содержащий пробел, : и - (который должен уцелели, так как он используется для диапазонов как [a-z]) - + после того, как набор символов означает один или более-

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

>>> re.split(":-| ", thestring) 
['Breathing', '1', '31.145', ...] 

Как я уже говорил в комментарии по этому вопросу, я бы подумал, что сепаратор будет просто : и - указывает на отрицательное число ..

+0

Вы regex были бы более легкими для чтения, если бы вы использовали необработанную строку (вам не нужно было бы удваивать escape-код). Кроме того, это будет разделено на '' - '' или '": "' ... что, вероятно, вполне приемлемо, но не совсем соответствует запросу в вопросе. – mgilson

+0

@mgilson Хорошее добавленное решение, которое разбивается на буквенный ': -' и используется raw-string, чтобы избежать' \\\\ 'ness – dbr

0

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

import re 
re.split('\s+|:-','Breathing 1:-135') 

Это дает ['Breathing', '1', '135'], что это именно то, что вы хотите. Здесь \s+ обозначает одно или несколько пробелов, | означает «или», а :- соответствует буквально.

Редактировать: @mgilson дал тот же ответ. В любом случае, вы можете посмотреть на documentation for python regex.

0

Это не совсем то, что вы просили, но это может быть то, что вам нужно в любом случае ;-)

lines = ['Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 6:-231.617'] 

data = {} 
for line in lines: 
    line = line.split() # split on spaces 
    values = (s.split(':-') for s in line[1:]) 
    data[line[0]] = {int(t):float(val) for t,val in values} 

результатов в

data = { 
    'Breathing': { 
     1: 31.145, 
     2: 35.9872, 
     3: 40.5393, 
     4: 37.8538, 
     5: 41.6323, 
     6: 231.617, 
     7: 39.0389, 
     8: 38.6924, 
     9: 32.8942, 
     10: 53.3063, 
     11: 45.2976, 
     12: 36.7487, 
     13: 35.8225, 
     14: 39.0697, 
     15: 40.5825, 
     16: 36.6343, 
     17: 36.2135, 
     18: 40.0523 
    } 
} 

Вы можете получить доступ к нему, как

data['Breathing'][2] # -> 35.9872 
Смежные вопросы