正则表达式非贪婪OR

时间:2013-11-27 23:11:09

标签: python regex django

说我有3个正则表达式A,B和C.

我需要将A和B匹配在一起或单独匹配,但始终至少匹配一个。 C是可选的。

到目前为止,我的合并正则表达式是A?B?C但是如果A和B不匹配,它仍然有效。 我已经尝试了A | BC但是如果A匹配,则不评估B,我需要对其进行评估。

(?P<param1>\d+)?(?P<param2>+\d+)?(?P<param3>\w+)

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用正则表达式

(?:A(?:B)?|B)(?:C)?

更新

如果您只需要使用ABC中的每一个,请使用

((?:A)?(?:B)?)(?!\1{100})(?:C)?

这不是100%正确,但应覆盖所有可能性的99.99 +%

答案 1 :(得分:0)

您可以匹配三个选项:(AB|A|B),但此确实要求您捕获4个不同的组;两个用于AB个案,另一个用于AB个案。提取捕获的组的代码必须考虑到这一点:

(?:(?P<param1_and>\d+)(?P<param2_and>+\d+)|(?P<param1_or>\d+)|(?P<param2_or>+\d+))(?P<param3>\w+)

并且您必须在捕获的群组中查找param1_andparam1_or以及param2_andparam2_or

答案 2 :(得分:0)

丑陋,也许这会起作用吗?

(?P<possibly_joined_params>\d+\+\d+|\d+|\+\d+)(?P<param3>\w+)?

然后在您看来,尝试拆分'+':

def someview(request, possibly_joined_params, param3=None):
    param_parts = possibly_joined_params.split('+')
    if len(param_parts) == 1:
        param1 = param_parts[0]
        param2 = ''
    else:
        param1, param2 = param_parts

我不确定这比仅仅有两种模式来匹配视图更清晰。

相关问题