2012-05-11 2 views
1

Скажем, у меня есть строка данных, которая может иметь форматирование, которое меняется. Номинально данные в строке будут разделены пробелами, но это не всегда так, поэтому простой .split(' ') не будет работать в этом случае.разделяет строку с несколькими разделителями И извлекает только одиночные символы

Пример строка:

string = '2012 05 06 04:20:00.0500 FOOBAR 4.7E+10 -55 33.0 555~2767 B 12 \r\n' 

Чтобы получить все номера мне нужно, которые могут содержать показатели, начинаются с -, +, или ~, или не имеют разделения пространства их можно использовать:

re.findall(r'[~+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?', string) 
# giving the result; 
['2012', '05', '06', '04', '20', '00.0500', '4.7E+10', '-55', '33.0', '555', '~2767', '12'] 

Мне также нужен только один символ (в данном случае B) из строки. Этот одиночный символ может быть либо B, F, или О, и я могу получить это и избежать FOOBAR в моей строке с помощью:

re.findall(r'((?:(?:\b))[FBO]\b)', string) 
# giving the result: 
['B'] 

Но что мне нужно, чтобы получить результат, который сочетает в себе два результата выше. Я всегда мог бы добавить список со вторым результатом, но мне бы очень хотелось, чтобы позиция результатов в соответствующем списке отображалась в том порядке, в котором они существуют в исходной строке string. То есть, мне нужен список, который выглядит следующим образом:

['2012', '05', '06', '04', '20', '00.0500', '4.7E+10', '-55', '33.0', '555', '~2767', 'B', '12'] 

Любые идеи? Или есть лучший способ?

+2

Не используйте 'str' как имя переменной, даже если это просто для этого примера. Вы затеняете встроенную ['str'] (http://docs.python.org/library/functions.html#str), поэтому ее нельзя вызвать. – jamylak

+1

Пропуск суждения, называя мою строку для этого примера ... Я изменил ее на «строку» в надежде, что другие не будут следовать за мной по темной улице с односторонним движением. – BFTM

ответ

3

Как насчет:

re.findall(r'([~+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|(?:(?:\b))[FBO]\b)', str) 

Это возвращает:

['2012', '05', '06', '04', '20', '00.0500', '4.7E+10', '-55', '33.0', '555', '~2767', 'B', '12'] 

Кроме того, не пилить, но перезапись типа Python str с именем переменной MADE будет содрогаться на секунду.

+0

Это регулярное выражение напоминает мне Perl. ;) –