在可变模式上使用正则表达式拆分字符串

时间:2018-01-16 19:27:37

标签: python regex python-3.x

我对一个相当简单的问题感到疯狂:我有一个我希望拆分的列表列表。有一个相当简单的模式,但有一个我似乎无法捕捉的变化:

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

谢谢。

1 个答案:

答案 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\+\-\.]+)?)'