2017-02-07 4 views
2

Я хочу разбить строку python line = '1 -1 2 3 -1 4', так что мой вывод представляет собой список python ['1','2','3','4']. Я пробовал решение, данное here и here. Однако, какой-то странный выход идет. Мой код:Сплит-строка python с несколькими разделителями

line = '1 -1 2 3 -1 4' 
import re  
t=re.split("-1| ", line) 

выход:

['1', '', '', '2', '3', '', '', '4'] 

Любая помощь приветствуется!

ответ

3

Это был хитрый :)

re.split(r"(?:\s-1)?\s",line) 
#['1', '2', '3', '4'] 

И самое быстрое решение (работает примерно в 4,5 раза быстрее, чем регулярное выражение):

line.replace("-1 ", "").split() 
1

Try:

t=re.split("\s+",line.replace("-1"," ")) 
+0

я, что золь ум. Как насчет временной сложности вышеуказанного кода или можем ли мы это сделать без замены -1 пробелом? – chandresh

+0

Да, я бы предположил, что это не самые эффективные из возможных решений. Нужно было бы провести некоторые временные тесты. – Amorpheuses

+0

Замена в пространстве кажется стабильной быстрее в 3-4 раза - но читателю, вероятно, следует выполнить свои собственные тесты времени для подтверждения. – Amorpheuses

0

You можно попробовать это также с помощью смотрового окна:

print re.findall('(?<=[^-])\d+', ' ' +line) 
# ['1', '2', '3', '4'] 

Это более общее, поскольку это отфильтровывает все отрицательные числа.

line = '-10 12 -10 20 3 -2 40 -5 5 -1 1' 
print re.findall('(?<=[^-\d])\d+', ' ' +line) 
# ['12', '20', '3', '40', '5', '1'] 
0

Я не использую регулярное выражение, но условный список понимание:

>>> line = '1 -1 2 3 -1 4' 
>>> [substr for substr in line.split() if not substr.startswith('-')] 
['1', '2', '3', '4'] 
-1

Я не могу сказать, будет ли это более эффективно, чем некоторые из других решений, но список понимание является очень читаемый и, безусловно, может сделать трюк:

line = '1 -1 2 3 -1 4' 
t = [str(item) for item in line.split(" ") if int(item) >= 0] 
>>> ['1', '2', '3', '4'] 
+0

Что относительно 0's? – DyZ

+0

@DYZ благодарит за то, что поймал это, исправлено –

Смежные вопросы