之前给出的基于列表推导式的解决方案存在一个小缺陷。如果输入中有尾随空格,则拆分可能会产生最后一个元素,该元素仅包含单个空格(或少于n个空格的某些空格数量,其中n是要拆分的最小空格数),Python在布尔上下文中将其视为True。因此,输出中的最后一个元素可能是不需要的空字符串:
>>> s = '10DEUTSCH GGS Neue Heide 25-27 Wahn-Heide -1 -1 '
>>> [t.strip() for t in s.split(' ') if t]
['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1', '']
有几种方法可以解决这个问题。其中一种是在检查其真实性之前剥离由split返回的每个元素:
>>> s = '10DEUTSCH GGS Neue Heide 25-27 Wahn-Heide -1 -1 '
>>> [t.strip() for t in s.split(' ') if t.strip()]
['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']
但是每个标记都剥离两次看起来有点丑陋。因此,另一种方法是在开始时只剥离输入:
>>> s = '10DEUTSCH GGS Neue Heide 25-27 Wahn-Heide -1 -1 '
>>> [t.strip() for t in s.strip().split(' ') if t]
['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']
如果你想使用列表推导式,那应该已经足够了。但是如果你对精确性有着不健康的追求,也许你会注意到由于拆分是从左到右进行的,每个拆分结果中的标记只能有前导空格,并且不需要的空字符串只能出现在最终输出的末尾。因此,如果你认为这多两个字符是值得的,你可以选择
>>> s = '10DEUTSCH GGS Neue Heide 25-27 Wahn-Heide -1 -1 '
>>> [t.lstrip() for t in s.rstrip().split(' ') if t]
['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']
如果您使用的是 Python 3.8+,您可以使用海象操作符来避免冗余的剥离:
>>> s = '10DEUTSCH GGS Neue Heide 25-27 Wahn-Heide -1 -1 '
>>> [w for t in s.split(' ') if (w := t.strip())]
['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']
str.split(' ')
的结果为['10DEUTSCH', '', '', '', 'GGS Neue Heide 25-27', '', ' Wahn-Heide', ' -1', '', '', '-1']
。正则表达式是在“2 或更多个空格”上拆分的好方法。 - dokkaebire.split(r'\s{2,}', text.replace("\n", ""))
可能会有用。 - KevinYanesG