说我有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+)
有什么想法吗?
答案 0 :(得分:2)
使用正则表达式
(?:A(?:B)?|B)(?:C)?
如果您只需要使用A
,B
和C
中的每一个,请使用
((?:A)?(?:B)?)(?!\1{100})(?:C)?
这不是100%正确,但应覆盖所有可能性的99.99 +%
答案 1 :(得分:0)
您可以匹配三个选项:(AB|A|B)
,但此确实要求您捕获4个不同的组;两个用于A
和B
个案,另一个用于A
或B
个案。提取捕获的组的代码必须考虑到这一点:
(?:(?P<param1_and>\d+)(?P<param2_and>+\d+)|(?P<param1_or>\d+)|(?P<param2_or>+\d+))(?P<param3>\w+)
并且您必须在捕获的群组中查找param1_and
或param1_or
以及param2_and
或param2_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
我不确定这比仅仅有两种模式来匹配视图更清晰。