用多个分隔符分隔字符串并仅提取单个字符

时间:2012-05-11 13:53:13

标签: python regex string list findall

假设我有一个可以改变格式的数据字符串。名义上字符串中的数据将由空格分隔,但情况并非总是如此,因此简单的.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']   

有什么想法吗?或者有更好的方法吗?

1 个答案:

答案 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会让人感到震惊。

相关问题