正则表达式:如何使用'或'没有更多捕获组?

时间:2018-02-16 11:52:52

标签: python regex expression capturing-group

我们应该只将正则表达式添加到脚本而不触及任何其他内容。制作脚本使其接受3个捕获组,并且有2个不同的正则表达式依赖于输出。我为这两种情况准备了epxressions,但是当我这样做时:

([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)()

该脚本认为有6个捕获组(每个表达式包含3个捕获组),因此给出了一个错误。

如果没有脚本认为有6个捕获组,我应该如何加入2个表达式,因为这两个表达式永远不能应用,它们可以是expression1或expression2,但不能同时使用两者。

表达式1是:

()()\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])

表达式2是:

{{1}}

感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

你有两个正常的替代品,很少有坏处:

第一次正常。通过代码分开:

geo_mean

第二个正常。使用所有6个口袋。

if (expression1) {
    DO SOMETHING
} else if (expression2) {
    DO SOMETHING
} else {
    NO MATCH FOR BOTH
}

对于糟糕的解决方案,你可以使用非常复杂的正则表达式,这可能会有一些隐藏的错误,这种表现很难维护,可能根本不可能。

答案 1 :(得分:-1)

编辑:更新后,因为第一个表达式中第1组和第2组为空,第3组中第3组为空,所以应将它们与非捕获组合并只删除空组:

(?:([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)|\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ]))

最后一组([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])也可以缩短

([a-zA-Z0-9]+(?:$|[ ]))

可以使用非捕获组(?: .. )代替( .. ),以便在不添加新组的情况下对模式进行分组。

没有关于expression1和expression2的更多信息,如果模式具有以下形式,则难以回答:

exp1: (g11)s11(g21)s21(g31)
exp2: (g12)s12(g22)s22(g32)

组合表达式可以是

(?=(?:g11)s11(?:g21)s21(?:g31)|(?:g12)s12(?:g22)s22(?:g32))((?:g11|g12))(?:s11|s12)((?:g21|g22))(?:s21|s22)((?:g31|g32))

但可能会根据需要进行简化。