我有一个类似的:
-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个数字作为数量级的元素。
答案 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']