用特殊字符在python中拆分

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

  • 当有特殊字符时,将字符串分成两部分,然后选择第一部分;

脚本

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
mingmingpi2009 回答:用特殊字符在python中拆分

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

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

大家都在问