假设我有一个可以改变格式的数据字符串。名义上字符串中的数据将由空格分隔,但情况并非总是如此,因此简单的.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,我可以通过使用以下内容来避免我的字符串中的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']
有什么想法吗?或者有更好的方法吗?
答案 0 :(得分: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
会让人感到震惊。