您可以使用两个不同的分隔符进行两次拆分:
result = [s.split()[0].split(';')[0] for s in array]
result
变为:
['srv1','srv2']
,
问题出在这里:line.split(';')[0] and line.split()[0]
您的 second 条件在空白处分割。因此,除非输入的开头没有分号,否则它将始终返回空格分隔的版本(在这种情况下,您会得到空字符串)。
您可能想将两个拆分链接在一起:
line.split(';')[0].split()[0]
要查看问题中的代码在做什么,请看一下条件表达式在几种不同情况下的作用:
array = ['srv1 s','srv2;192.168.9.1',';192.168.1.1','srv1;srv2 192.168.1.1']
>>> for item in array:
... print("Original: {}\n\tSplit: {}".format(item,item.split(';')[0] and item.split()[0]))
...
Original: srv1 s
Split: srv1 # split on whitespace
Original: srv2;192.168.9.1
Split: srv2;192.168.9.1 # split on whitespace!
Original: ;192.168.1.1
Split: # split on special char,returned empty which is falsey,returns empty str
Original: srv1;srv2 192.168.1.1
Split: srv1;srv2 # split only on whitespace
,
这应该在任何特殊的宪章上分割,并将分割的第一部分附加到新列表中:
array = [
'srv1 #s','srv2;192.168.9.1'
]
sep = (r'[`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./<>?]')
rest = text.split(sep,1)[0]
new_array =[]
for i in array:
new_array.append(re.split(sep,i)[0])
输出:
['srv1 ','srv2']
,
更改
outfinally = [line.split(';')[0] and line.split()[0] for line in x.splitlines() if line and line[0].isalpha()]
收件人
outfinally = [line.replace(';',' ').split()[0] for line in x.splitlines() if line and line[0].isalpha()]
当您像这样使用and
时,只要第一个结果是真实的,它将始终返回第一个结果。如果找不到匹配项,则split函数将在列表中返回完整字符串。由于它返回的是真实值,因此您永远都不会继续进行第二种情况(如果像我第一次尝试使用or
一样,您将总是继续进行第二种情况)。您不必将2个条件合并为一个条件。像line.replace(';',' ').split()[0]
或blhsing的解决方案都更好。
本文链接:https://www.f2er.com/2932271.html