Skip to main content
 首页 » 编程设计

python之使用 re(正则表达式)仅解析一行

2025年05月04日27mq0036

我的实验室正在使用一种生成大量数据作为输出的软件,因此我试图使用 Python 使事情变得更容易。到目前为止,我认为最好的方法是生成列表并将其视为数据 block ,但这并不容易: 第一个数据 block 很简单:3 列是固定的,可以简单地通过以下方式获得:

chunk1 = my_data[:3] 

第二 block 数据并不容易,因为它可以有2、3 或4 列。我认为这里的关键是第二个 block 在我们找到一个字母时结束(类似于1 3 7 CCC)。在这种情况下,我认为可以使用re 模块 来解析两列、三列或四列并在第一个字母之前停止,但我不知道该怎么做。我打算通过用零或“-”填充空位来“规范化”这些列,因此如果我有 2 列的情况,我会将其填充为 [x, y, 0, 0]以及带有 [x, y, z, 0] 的 3 列情况。

第三 block 是固定的(两个、三个或四个字母和一个数字),如下所示:CCC 119.62

剩下的是第 4 个 block 。

这是困惑输出的表示:

最终结果可能是这样的: ["s 91", "1.00", "OUT"] ["9", "3", "12", "7"] ["OCCC", "0.34"] ["f829", "27","f752","33"]

到目前为止,我一直在努力弄清楚如何让 re 模块 像这样工作:

非常感谢任何帮助,伙计们。

数据样本

s 27    1.00   STRE   30   16   OC    1.355049  f1291 50 
s 28   -1.00   STRE    8    6   CC    1.494281  f1340 12  f1271 17 
s 29   -1.00   STRE   14   15   NC    1.421282  f1358 49 
s 30    1.00   STRE   14   15   NC    1.421282  f1337 10  f1290 33 
s 31    1.00   STRE    8    6   CC    1.494281  f1171 15  f323 11 
s 32    1.00   STRE   30   31   OC    1.419982  f1082 51  f1077 24 
s 33    1.00   STRE   13   11   ClC    1.740581  f842 15  f323 19 
s 34   -1.00   BEND    1    3    7   CCC   119.62  f1037 26  f485 10 
s 35   -1.00   BEND    3    1    4   CCC   119.74  f1124 29 
s 36    1.00   BEND    7    3    1   CCC   119.62  f733 25  f288 13 
s 37    1.00   BEND   21   14   15   HNC   116.16  f1578 40  f1560 20 
s 38    1.00   BEND   24    5    2   HCC   119.73  f1186 67 
s 39    1.00   BEND   25    2    6   HCC   118.80  f1536 53  f1082 10  f1077 17 
s 40   -1.00   BEND   24    5    2   HCC   119.73  f1508 44  f1171 14  f1124 13 
s 41    1.00   BEND   25    2    6   HCC   118.80  f1669 14  f1271 32  f1124 15 
s 42   -1.00   BEND   26   19   18   HCC   119.04  f1578 10  f1560 37  f1291 11 
s 89    1.00   TORS   31   30   16   19   COCC     0.24  f161 14  f104 46  f87 19  f43 10 
s 90    1.00   OUT     8    2    3    6   CCCC     1.09  f466 36  f125 22 
s 91    1.00   OUT     9    3   12    7   OCCC     0.34  f829 27  f752 33 

请您参考如下方法:

我写了一个生成器,它从迭代器中提取数据,直到找到字母字符串。

from itertools import chain 
 
def while_not_alpha(iterator): 
    iterator = iter(iterator) 
    for s in iterator: 
        if not str(s).isalpha(): 
            yield s 
        else: 
            yield chain([s], iterator) 
            break 
 
def parse(line): 
    *chunk1, rest = line.split(maxsplit=4) 
    *chunk2, rest = while_not_alpha(rest.split()) 
    rest = list(rest) 
    chunk3 = rest[:2] 
    chunk4 = rest[2:] 
    return chunk1, chunk2, chunk3, chunk4 
 
# See below for definition of `txt` 
chunk1, chunk2, chunk3, chunk4 = map(list, zip(*map(parse, txt.splitlines()))) 

我们可以看到chunk2看起来像

chunk2[:4] 
 
[['30', '16'], 
 ['8', '6'], 
 ['14', '15'], 
 ['14', '15']] 

和chunk3

chunk3[:4] 
 
[['OC', '1.355049'], 
 ['CC', '1.494281'], 
 ['NC', '1.421282'], 
 ['NC', '1.421282']] 

我们本可以更进一步制作数据框

chunk1, chunk2, chunk3, chunk4 = map( 
    pd.DataFrame, map(list, zip(*map(parse, txt.splitlines())))) 
 
chunk2.head() 
 
     0   1     2     3 
0   30  16  None  None 
1    8   6  None  None 
2   14  15  None  None 
3   14  15  None  None 
4    8   6  None  None 
5   30  31  None  None 
6   13  11  None  None 
7    1   3     7  None 
8    3   1     4  None 
9    7   3     1  None 
10  21  14    15  None 
11  24   5     2  None 
12  25   2     6  None 
13  24   5     2  None 
14  25   2     6  None 
15  26  19    18  None 
16  31  30    16    19 
17   8   2     3     6 
18   9   3    12     7 

或者更进一步:

df = pd.concat( 
    map(pd.DataFrame, map(list, zip(*map(parse, txt.splitlines())))), 
    axis=1, keys=[f'chunk{i}' for i in range(1, 5)] 
) 
 
df 
 
   chunk1                  chunk2                 chunk3           chunk4                                           
        0   1      2     3      0   1     2     3      0         1      0   1      2     3      4     5     6     7 
0       s  27   1.00  STRE     30  16  None  None     OC  1.355049  f1291  50   None  None   None  None  None  None 
1       s  28  -1.00  STRE      8   6  None  None     CC  1.494281  f1340  12  f1271    17   None  None  None  None 
2       s  29  -1.00  STRE     14  15  None  None     NC  1.421282  f1358  49   None  None   None  None  None  None 
3       s  30   1.00  STRE     14  15  None  None     NC  1.421282  f1337  10  f1290    33   None  None  None  None 
4       s  31   1.00  STRE      8   6  None  None     CC  1.494281  f1171  15   f323    11   None  None  None  None 
5       s  32   1.00  STRE     30  31  None  None     OC  1.419982  f1082  51  f1077    24   None  None  None  None 
6       s  33   1.00  STRE     13  11  None  None    ClC  1.740581   f842  15   f323    19   None  None  None  None 
7       s  34  -1.00  BEND      1   3     7  None    CCC    119.62  f1037  26   f485    10   None  None  None  None 
8       s  35  -1.00  BEND      3   1     4  None    CCC    119.74  f1124  29   None  None   None  None  None  None 
9       s  36   1.00  BEND      7   3     1  None    CCC    119.62   f733  25   f288    13   None  None  None  None 
10      s  37   1.00  BEND     21  14    15  None    HNC    116.16  f1578  40  f1560    20   None  None  None  None 
11      s  38   1.00  BEND     24   5     2  None    HCC    119.73  f1186  67   None  None   None  None  None  None 
12      s  39   1.00  BEND     25   2     6  None    HCC    118.80  f1536  53  f1082    10  f1077    17  None  None 
13      s  40  -1.00  BEND     24   5     2  None    HCC    119.73  f1508  44  f1171    14  f1124    13  None  None 
14      s  41   1.00  BEND     25   2     6  None    HCC    118.80  f1669  14  f1271    32  f1124    15  None  None 
15      s  42  -1.00  BEND     26  19    18  None    HCC    119.04  f1578  10  f1560    37  f1291    11  None  None 
16      s  89   1.00  TORS     31  30    16    19   COCC      0.24   f161  14   f104    46    f87    19   f43    10 
17      s  90   1.00   OUT      8   2     3     6   CCCC      1.09   f466  36   f125    22   None  None  None  None 
18      s  91   1.00   OUT      9   3    12     7   OCCC      0.34   f829  27   f752    33   None  None  None  None 

设置

txt = """\ 
s 27    1.00   STRE   30   16   OC    1.355049  f1291 50 
s 28   -1.00   STRE    8    6   CC    1.494281  f1340 12  f1271 17 
s 29   -1.00   STRE   14   15   NC    1.421282  f1358 49 
s 30    1.00   STRE   14   15   NC    1.421282  f1337 10  f1290 33 
s 31    1.00   STRE    8    6   CC    1.494281  f1171 15  f323 11 
s 32    1.00   STRE   30   31   OC    1.419982  f1082 51  f1077 24 
s 33    1.00   STRE   13   11   ClC    1.740581  f842 15  f323 19 
s 34   -1.00   BEND    1    3    7   CCC   119.62  f1037 26  f485 10 
s 35   -1.00   BEND    3    1    4   CCC   119.74  f1124 29 
s 36    1.00   BEND    7    3    1   CCC   119.62  f733 25  f288 13 
s 37    1.00   BEND   21   14   15   HNC   116.16  f1578 40  f1560 20 
s 38    1.00   BEND   24    5    2   HCC   119.73  f1186 67 
s 39    1.00   BEND   25    2    6   HCC   118.80  f1536 53  f1082 10  f1077 17 
s 40   -1.00   BEND   24    5    2   HCC   119.73  f1508 44  f1171 14  f1124 13 
s 41    1.00   BEND   25    2    6   HCC   118.80  f1669 14  f1271 32  f1124 15 
s 42   -1.00   BEND   26   19   18   HCC   119.04  f1578 10  f1560 37  f1291 11 
s 89    1.00   TORS   31   30   16   19   COCC     0.24  f161 14  f104 46  f87 19  f43 10 
s 90    1.00   OUT     8    2    3    6   CCCC     1.09  f466 36  f125 22 
s 91    1.00   OUT     9    3   12    7   OCCC     0.34  f829 27  f752 33"""