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,我可以得到它并避免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']   

有任何想法吗?或者,还有更好的方法?

4

1 回答 1

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']

另外,不要唠叨,而是str用变量名覆盖 Python 类型会让人不寒而栗。

于 2012-05-11T14:08:39.270 回答