0

我在遍历具有值的数组的字符串中拆分,此拆分必须包含以下规则:

  • 当有特殊字符时,将字符串拆分为两部分,并选择第一部分作为结果;

脚本

array = [
'srv1 #s',
'srv2;192.168.9.1'
]

result = []
for x in array:

  outfinally = [line.split(';')[0] and line.split()[0] for line in x.splitlines() if line and line[0].isalpha()]

  for srv in outfinally:
      if srv != None:
          result.append(srv)

for i in result:
  print(i)

输出

srv1
srv2;192.168.9.1

期望的输出

srv1
srv2
4

4 回答 4

1

问题在这里:line.split(';')[0] and line.split()[0]

你的第二个条件在空格上分裂。因此,除非输入开头有分号(在这种情况下,您会得到空字符串),否则它将始终返回空格分割版本。

您可能希望改为链接两个拆分:

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
于 2019-12-12T17:17:54.547 回答
1

这应该在任何特殊章程上拆分,并将拆分的第一部分附加到新列表中:

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']
于 2019-12-12T17:19:45.280 回答
1

您可以使用两个不同的分隔符拆分两次:

result = [s.split()[0].split(';')[0] for s in array]

result变成:

['srv1', 'srv2']
于 2019-12-12T17:15:46.363 回答
0

改变

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像我第一次尝试做的那样使用,你总是会进入第二个条件)。而不是有两个条件,你要做的就是将它们组合成一个。类似line.replace(';', ' ').split()[0]或blhsing的解决方案甚至更好。

于 2019-12-12T17:12:23.910 回答