我对一个相当简单的问题感到疯狂:我有一个我希望拆分的列表列表。有一个相当简单的模式,但有一个我似乎无法捕捉的变化:
[['XXOOY00 100.00–200.00 300.000 -1.000 XX0IY00 300.00–400.00 500.000 +10.000 XX2IY00 600.00–700.00 800.00 0.000'],
['XXOOY00 100.00–200.00 300.000 -1.000 XX0IY00 300.00–400.00 500.000 XX2IY00 600.00–700.00 800.00 0.000']]
列表éléments中的一般模式是代码,范围,值,更改。正如您所看到的,第二个列表中的模式存在差异,因为第二个元素只有代码,范围,值。为了拆分这些列表,我使用这个正则表达式:
for element in list:
final_list.append(re.split('([A-Z]{2}[A-Z0-9]{1}[A-Z]{2}[A-Z0-9]{2}\s\S*\s\S*\s\S*)\s', element))
然而,这在第二个列表上失败,因为我有:
[['XXOOY00 100.00–200.00 300.000 -1.000, XX0IY00 300.00–400.00 500.000 +10.000, XX2IY00 600.00–700.00 800.00 0.000'],
['XXOOY00 100.00–200.00 300.000 -1.000, XX0IY00 300.00–400.00 500.000 XX2IY00, 600.00–700.00 800.00 0.000']]
虽然预期结果是:
[['XXOOY00 100.00–200.00 300.000 -1.000, XX0IY00 300.00–400.00 500.000 +10.000, XX2IY00 600.00–700.00 800.00 0.000'],
['XXOOY00 100.00–200.00 300.000 -1.000, XX0IY00 300.00–400.00 500.000, XX2IY00 600.00–700.00 800.00 0.000']]
哪种正则表达模式允许我这样做?
澄清:我想要一个列表,以便如果我明智地阅读列表元素的内容,我有:
XXOOY00 100.00–200.00 300.000 -1.000
XX0IY00 300.00–400.00 500.000 +10.000
XX2IY00 600.00–700.00 800.00 0.000
XXOOY00 100.00–200.00 300.000 -1.000
XX0IY00 300.00–400.00 500.000
XX2IY00 600.00–700.00 800.00 0.000
谢谢。
答案 0 :(得分:1)
您可以使用您的可选'更改'字段由数字,+, - 和小数点构成,可以用重新模式表示为:\s[0-9\+\-\.]+
(包括前面的空格很方便)
现在您希望此模式出现一次或零次:(\s[0-9\+\-\.]+)?
这需要分组(括号),但您不希望在结果列表中单独捕获和添加该组。因此,您必须将其设为非捕获组:(?:\s[0-9\+\-\.]+)?
完整的模式可能是:
'([A-Z]{2}[A-Z0-9][A-Z]{2}[A-Z0-9]{2}\s\S+\s\S+(?:\s[0-9\+\-\.]+)?)'