这里我的原始文本内容为:

'chiplet A            part B    clk C                                                                                 load_count D    cts_root E chiplet_hier "1 2 3 4 5 6 7 "\n'

我想匹配每一个词,并且忽略双引号内的空格分割。

因此想到了用Python的正则表达式,写法如下:

In [1]: import re

In [2]: line = 'chiplet A            part B    clk C                                                                                 load_count D    cts_root E chiplet_hier "
   ...: 1 2 3 4 5 6 7 "\n'
   ...: temp_data = re.findall(r'[^\s\"\']+|"([^"]*)"',line)

但是输出却是:

In [3]: temp_data
Out[3]: ['', '', '', '', '', '', '', '', '', '', '', '1 2 3 4 5 6 7 ']

单独测试[^\s\"\']+"([^"]*)"都能获得正常的输出,唯独加在一起不行。

想了半天没想明白哪里出问题,最后发现是因为"([^"]*)"加了括号的缘故。

正则匹配表达式,如果加了()就代表按照group输出,输出会输出每一次匹配的结果,与一个不带空格的做或,会使得前面匹配的结果丢失。

re.findall的文档可以发现:

If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group.

这里去掉空格:

In [4]: line = 'chiplet A            part B    clk C                                                                                 load_count D    cts_root E chiplet_hier "
   ...: 1 2 3 4 5 6 7 "\n'
   ...: temp_data = re.findall(r'[^\s\"\']+|"[^"]*"',line)

In [5]: temp_data
Out[5]: 
['chiplet',
 'A',
 'part',
 'B',
 'clk',
 'C',
 'load_count',
 'D',
 'cts_root',
 'E',
 'chiplet_hier',
 '"1 2 3 4 5 6 7 "']

是个很蠢得问题,但是卡了半天没找到原因所在。

Last modification:July 14, 2022
恰饭环节