2012-05-11 32 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,或O和I可以用得到這個,避免我的字符串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

對於這個例子,判斷我的字符串命名失誤......我把它改成了'string',希望別人不會跟着我走下那條黑暗的單行道。 – 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做是第二有不寒而慄。

+0

這個正則表達式讓我想起了Perl。 ;) –

相關問題