2012-06-15 49 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

你想要的数组内容是什么?你确定你不想要' - '?数据结构的重要性是什么? –

+0

@KarlKnechtel我相信我不想要''''。 'array [0] ==呼吸,数组[1] == 1,数组[2] == 31.145'等等。 –

+0

你试过正则表达式吗? –

回答

2

您可以使用str.split([sep[, maxsplit]])

返回词的列表的字符串,使用sep作为分隔符字符串。如果给出maxsplit,最多可以完成maxsplit分割(因此,列表最多只能有maxsplit + 1个元素)。如果未指定maxsplit或-1,则分割数量没有限制(所有可能的分割)。

应用

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

在 “串联” 与str.replace(old, new[, count])

返回字符串的子串用旧的换成新出现的所有副本。如果给出可选的参数计数,则仅替换第一个计数事件。

应用

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

为什么在split()上使用'rsplit()'? –

+0

@Lattyware:只是一个mistyping :) – DonCallisto

+0

@acattle:更好看 – DonCallisto

3

UPDATE采取:我不知道,Breathing是你的一部分数据。在这种情况下,你会得到所有的字符串。

假设:

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+"更改为"\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

如果你使用一个原始字符串(你不需要双重转义 - ),那么你的正则表达式会更容易阅读。此外,这将分割在'' - “或'”:“'......这可能是完全可以接受的,但并不完全符合问题中的请求。 – mgilson

+0

@mgilson好点 - 在文字':-'上分割的附加解决方案,并使用原始字符串避免'\\\\'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 
相关问题