2015-05-26 3 views
2

Мне нужно проанализировать числовые значения из строки, которая не очень хорошо отформатирована. Пример:Python - Разделить строку числовых значений с неизвестными разделителями

"0 0 .1  .05  .05  0.  0.   .01" 

или

"0,0,.1,.05,.05,0.,0.,.01" 

Как видно разделитель может варьироваться от нескольких пространств с запятой без пробелов. Кроме того, цифры могут быть int или float. Я хотел бы разделить на любое количество последовательных пробелов, вкладок и запятых. Я думал, что могу сделать это с помощью функции str.split(), однако обнаружил, что он работает только с одним аргументом разделителя и не будет делать запятые по умолчанию.

Кто-нибудь знает умный способ сделать это? Возможно, с регулярными выражениями?

Заранее спасибо.

ответ

2

Я хотел бы разделить на любое количество последовательных пробелов, табуляции и запятыми.

Вы можете использовать re.split(), чтобы разделить на регулярное выражение.

>>> import re 
>>> s = '0 0 .1  .05  .05  0.  0.   .01' 
>>> re.split(r'[\s,]+', s) 

['0', '0', '.1', '.05', '.05', '0.', '0.', '.01'] 

Примечание: выше будет разделена соответственно на пробельных и запятой. Если вы хотите разбить строго на <space>, табы и запятые, вы можете изменить регулярное выражение на [ \t,]+ ...

0

Вы можете разделить со следующим регулярным выражением: [, ]+

Пример:

import re 

pattern = r'[,\s]+' 

row = "0 0 .1  .05  .05  0.  0.   .01" 
re.split(pattern, row) 
# > ['0', '0', '.1', '.05', '.05', '0.', '0.', '.01'] 

row = "0,0,.1,.05,.05,0.,0.,.01" 
re.split(pattern, row) 
# > ['0', '0', '.1', '.05', '.05', '0.', '0.', '.01'] 
2

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

s.replace(',', ' ').split() 

Демо:

>>> s = "0 0 .1  .05  .05  0.  0.   .01" 
>>> s.replace(',', ' ').split() 
['0', '0', '.1', '.05', '.05', '0.', '0.', '.01'] 

>>> s = "0,0,.1,.05,.05,0.,0.,.01" 
>>> s.replace(',', ' ').split() 
['0', '0', '.1', '.05', '.05', '0.', '0.', '.01'] 
+0

Спасибо за размышление вне рамки регулярных выражений (+1). – nalyd88

2

Вы можете использовать re.split.

[ ,]+ 

Вы можете разделить на это.

import re 
y="0,0,.1,.05,.05,0.,0.,.01" 
print re.split(r"[ ,]+",y) 

Или

Вы можете использовать просто использовать re.findall .Здесь вы можете иметь любой разделитель.

import re 
y="0,0,.1,.05,.05,0.,0.,.01" 
print re.findall(r"\d*(?:\.\d+)?",y) 
+1

Спасибо за дополнительную заметку «findall». – nalyd88

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