Неожиданное поведение с string.split () - PullRequest
0 голосов
/ 12 февраля 2019

Скажем, у меня есть строка, string = 'a'

Я делаю string.split(), и я получаю ['a']

Я не хочу этого, я только хочу список, когда у меня естьпробел в моей строке, аля string = 'a b c d'

До сих пор я безуспешно пробовал все следующее:

>>> a = 'a'
>>> a.split()
['a']
>>> a = 'a b'
>>> a.split(' ')
['a', 'b']
>>> a = 'a'
>>> a.split(' ')
['a']
>>> import re
>>> re.findall(r'\S+', a)
['a']
>>> re.findall(r'\S', a)
['a']
>>> re.findall(r'\S+', a)
['a', 'b']
>>> re.split(r'\s+', a)
['a', 'b']
>>> a = 'a'
>>> re.split(r'\s+', a)
['a']
>>> a.split(" ")
['a']
>>> a = "a"
>>> a.split(" ")
['a']
>>> a.strip().split(" ")
['a']
>>> a = "a".strip()
>>> a.split(" ")
['a']

Я сумасшедший?Я не вижу пробелов в строке «а».

>>> r"[^\S\n\t]+"
'[^\\S\\n\\t]+'
>>> print(re.findall(r'[^\S\n\t]+',a))
[]

Что случилось?

РЕДАКТИРОВАТЬ

FWIW,вот как я получил то, что мне было нужно:

# test for linked array
if typename == 'org.apache.ctakes.typesystem.type.textsem.ProcedureMention':
    for f in AnnotationType.all_features:
        if 'Array' in f.rangeTypeName:
            if attributes.get(f.name) and typesystem.get_type(f.elementType):
                print([ int(i) for i in attributes[f.name].split() ])

и это конец ...

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Поведение split имеет смысл, оно всегда возвращает список.Почему бы просто не проверить, равна ли длина списка 1?

def weird_split(a):
    words = a.split()
    if len(words) == 1:
        return words[0]
    return words
0 голосов
/ 12 февраля 2019

Вы можете использовать условное выражение для проверки наличия пробела и использовать split, только если пробел обнаружен:

str1 = 'abc'
split_str1 = str1 if (' ' not in str1) else str1.split(' ')
print (split_str1)
str1 = 'ab c'
split_str1 = str1 if (' ' not in str1) else str1.split(' ')
print (split_str1)

Это даст вывод:

abc
['ab', 'c']
0 голосов
/ 12 февраля 2019

Split всегда возвращает список, попробуйте это.

def split_it(s):
    if len(s.split()) > 1:
        return s.split()
    else:
        return s
...