如何使用2个条件中的任何一个分割线条?

时间:2018-03-07 15:16:33

标签: python python-3.x

我有一个类似的:

-110-108 -95 -92 -88 -87 -85 -75  -73 -69 -67 -59 -51 -49 -47 -42  -39 -35 -36 -36 -32 -27 -29 -32

我需要将其拆分为一个列表,以便我获得所有24个元素,如:

["-110", "-108", "-95" ....]

我尝试了line.split(" "),但是当我将列表作为以下内容时,这不起作用:

["-110-108" ...]

这是因为-110和-1之间没有空格。 -108。

我尝试将其拆分为line.split("-"),但这有两个问题:

分隔符丢失,如果没有负号,则整数被视为字符串。

赞:["-", "110", "-", "95" .... , "5 6 7"]假设有正数。

如何将str完全拆分为str包含24个数字,我需要一个列表,其中包含所有24个数字作为数量级的元素。

2 个答案:

答案 0 :(得分:9)

您可以使用regex

import re

s = "-110-108 -95 -92 -88 -87 -85 -75  -73 -69 -67 -59 -51 -49 -47 -42  -39 -35 -36 -36 -32 -27 -29 -32"

l = [x for x in re.split("(-?\d+)",s) if x.rstrip()]

print(l)

输出:

['-110', '-108', '-95', '-92', '-88', '-87', '-85', '-75', '-73', 
 '-69', '-67', '-59', '-51', '-49', '-47', '-42', '-39', '-35', 
 '-36', '-36', '-32', '-27', '-29', '-32']

说明:

re.split(pattern, string)使用模式进行拆分,我使用(-?\d+)提供的模式表示:可选-后跟1位或更多位数。

列表推导过滤器“空”或“仅空白”通过使用if x.rstrip()删除空(== False)结果进行拆分。

如果您想要转换它们,请使用:

l = [int(x) for x in re.split("(-?\d+)",s) if x.rstrip()]

或者 - 不是高效的,创建了许多中间字符串,你可以“修复”它:

s = "-110-108 -95 -92 -88 -87 -85 -75  -73 -69 -67 -59 -51 -49 -47 -42  -39 -35 -36 -36 -32 -27 -29 -32"

for i in range(10): 
    s = s.replace(f'-{i}',f' -{i}') # replace any "-0","-1",...,"-9" 
                                    #        with " -0"," -1",...," -9" 

l = [x for x in s.split(" ") if x] # split by ' ' only use non-empty ones

你可以通过迭代字符来自己拆分(更好的是产生大量的中间字符串)

s = "-110-108 -95 -92 -88 -87 -85 -75  -73 -69 -67 -59 -51 -49 -47 -42  -39 -35 -36 -36 -32 -27 -29 -32"

result = [] # complete list
tmp = [] # partlist
for c in s: # char-wise iteration 
    if c != '-':
        tmp.append(c)  
    else:
        if tmp:
            result.append(''.join(tmp).strip())
        tmp = ['-']

if tmp: # tmp not empty, and not yet added (last number in s)
    result.append(''.join(tmp))

print(result)

答案 1 :(得分:2)

您可以使用re.findall()和正则表达式-\d+

re.findall(r'-\d+', str)

输出:

['-110', '-108', '-95', '-92', '-88', '-87', '-85', '-75', '-73', '-69', '-67', '-59', '-51', '-49', '-47', '-42', '-39', '-35', '-36', '-36', '-32', '-27', '-29', '-32']