regex 正则表达式分析文本和数字块

xdnvmnnf  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(83)

我被这个正则表达式卡住了。我想为每个从AELIST开始的块提取一个字符串,忽略SET1(或任何其他头)块。+表示单个数组的延续。块可以由全大写的单词或不以+结尾的行或不以+开头的行分割
我目前的尝试是

import re

filestr1='''AELIST         1    5159    5160    7007    7008    7015    7016    7023+       \n+           7024    7031    7032    7039    7040    7047    7048    7055+       \n+           7056    7063    7064    7071    7072    7079    7080    7087+       \n+           7088    7095    7096    7103    7104    7111    7112    7119+       \n+           7120    7127    7128    7135    7136    7143    7144    7151+       \n+           7152    7159    7160    7167    7168    7175    7176    7183+       \n+           7184    7191    7192    7199    7200    7207    7208    7215+       \n+           7216    7223    7224    7231    7232                        \nSET1           2    6159    6160    9007    9008    9015    9016    9023+       \n+           9024    9031    9032    9039    9040    9047    9048    9055+       \n+           9056    9063    9064    9071    9072    9079    9080    9087+       \n+           9088    9095    9096    9103    9104    9111    9112    9119+       \n+           9120    9127    9128    9135    9136    9143    9144    9151+       \n+           9152    9159    9160                                        \nAELIST         5   11017   11018   11023   11024   11029   11030   11035+       \n+          11036   11041   11042   11047   11048   11053   11054   11059+       \n+          11060   11065   11066   11071   11072   11077   11078   11083+       \n+          11084   11089   11090   11095   11096   11101   11102   11107+       \n+          11108                                                        '''

re1 = re.findall('^[A-Z].*|^[+].*',filestr1, re.MULTILINE)
print(re1)
['AELIST         1    5159    5160    7007    7008    7015    7016    7023+       ',
 '+           7024    7031    7032    7039    7040    7047    7048    7055+       ',
 '+           7056    7063    7064    7071    7072    7079    7080    7087+       ',
 '+           7088    7095    7096    7103    7104    7111    7112    7119+       ',
 '+           7120    7127    7128    7135    7136    7143    7144    7151+       ',
 '+           7152    7159    7160    7167    7168    7175    7176    7183+       ',
 '+           7184    7191    7192    7199    7200    7207    7208    7215+       ',
 '+           7216    7223    7224    7231    7232                        ',
 'SET1           2    6159    6160    9007    9008    9015    9016    9023+       ',
 '+           9024    9031    9032    9039    9040    9047    9048    9055+       ',
 '+           9056    9063    9064    9071    9072    9079    9080    9087+       ',
 '+           9088    9095    9096    9103    9104    9111    9112    9119+       ',
 '+           9120    9127    9128    9135    9136    9143    9144    9151+       ',
 '+           9152    9159    9160                                        ',
 'AELIST         5   11017   11018   11023   11024   11029   11030   11035+       ',
 '+          11036   11041   11042   11047   11048   11053   11054   11059+       ',
 '+          11060   11065   11066   11071   11072   11077   11078   11083+       ',
 '+          11084   11089   11090   11095   11096   11101   11102   11107+       ',
 '+          11108                                                        ']

预期的输出将是每个AELIST块的列表的列表,而不是SET1块的列表

[['1', '5159', '5160', '7007', '7008', '7015', '7016', '7023', '7024', '7031', '7032', '7039', '7040', '7047', '7048', '7055', '7056', '7063', '7064', '7071', '7072', '7079', '7080', '7087', '7088', '7095', '7096', '7103', '7104', '7111', '7112', '7119', '7120', '7127', '7128', '7135', '7136', '7143', '7144', '7151', '7152', '7159', '7160', '7167', '7168', '7175', '7176', '7183', '7184', '7191', '7192', '7199', '7200', '7207', '7208', '7215', '7216', '7223', '7224', '7231', '7232'], ['5', '11017', '11018', '11023', '11024', '11029', '11030', '11035', '11036', '11041', '11042', '11047', '11048', '11053', '11054', '11059', '11060', '11065', '11066', '11071', '11072', '11077', '11078', '11083', '11084', '11089', '11090', '11095', '11096', '11101', '11102', '11107', '11108']]

谢谢

kyks70gy

kyks70gy1#

这看起来是一个简单的解决方案

(?ms)^AELIST.*?(?=^[A-Z]|\Z)

https://regex101.com/r/DzKhYB/1

(?ms)                  # Flags: multi-line, dot matches all
 ^ AELIST .*?           # Begin 'AELIST`
 (?= ^ [A-Z] | \Z )     # Match up to begin newline Cap or end of file '\Z'

相关问题