有这一行:
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 :(得分: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]
等范围) - {{ 1}}字符集表示一个或多个
要明确分割空格或+
,您可以使用:-
或正则表达式:
|
正如我在问题评论中所提到的,我认为分隔符只是>>> re.split(":-| ", thestring)
['Breathing', '1', '31.145', ...]
而:
表示负数。
答案 1 :(得分:3)
更新:我没有意识到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()
用于所有数字字符串以将它们转换为浮点数,并且'呼吸'字符串放在列表的开头。
答案 2 :(得分:2)
您可以使用str.split([sep[, maxsplit]])
使用sep作为分隔符字符串,返回字符串中的单词列表。如果给出maxsplit,则最多完成maxsplit拆分(因此,列表最多将包含maxsplit + 1个元素)。如果未指定maxsplit或-1,则对分割数量没有限制(所有可能的分割都会生成)。
应用
>> ' 1 2 3 '.split()
['1', '2', '3']
与str.replace(old, new[, count])
返回字符串的副本,其中所有出现的substring old都替换为new。如果给出了可选参数计数,则仅替换第一次计数出现次数。
应用
>>> 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']
所有定义均来自手册
答案 3 :(得分:0)
import re
array=re.split(r'\s+|:-',mystring)
在正则表达式中,\s+
匹配空格,而:-
匹配字符串中的文字序列。如果这些条件中的任何一个匹配,那么管道(|
)就是说匹配的方式。
当然,如果您想确保按照问题中的要求拆分单个空格,则可以将"\s+"
更改为"\s"
甚至" "
。
答案 4 :(得分:0)
使用正则表达式可能是最好的方法:
import re
re.split('\s+|:-','Breathing 1:-135')
这会给你['Breathing', '1', '135']
,这正是你想要的。这里,\s+
代表一个或多个空格,|
代表“或”,:-
字面匹配。
编辑:@mgilson给出了相同的答案。无论如何,您可能需要查看documentation for python regex。
答案 5 :(得分: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