正则表达式在python中设置组长度

时间:2016-08-05 04:09:25

标签: python regex

我有一个版本'major.minor.patch'
主要版本范围[0-99999]
次要版本范围[0-9999]
补丁版本范围[0-999999]
但总的来说'major.minor.path'不应超过16个字符,包括。 (点)。 我尝试过以下reg表达式

^(\d{1,5}[.]\d{1,4}[.]\d{1,6}){1,16}$

但{1,16}表示先前表达式的1到16次重复,而不是前一组的长度 如何将后续组的长度设为16

(\d{1,5}[.]\d{1,4}[.]\d{1,6})

2 个答案:

答案 0 :(得分:2)

这里有两个你要组合的正则表达式

  1. ^[\d.]{,16}$
  2. ^\d{1,5}[.]\d{1,4}[.]\d{1,6}$
  3. 两者本身都是无效的,因为(1)可以匹配超过2个点,并且不尊重每个版本的个别长度限制。 (2)肯定不起作用,因为它超过16个字符的字符串长度限制,包括'。'

    一个鲜为人知的正则表达式的特征可以用来组合(和 - )上面的正则表达式,就像

    ^(?=[\d.]{,16}$)\d{1,5}[.]\d{1,4}[.]\d{1,6}$
    

    示例:

    exp = r'^(?=[\d.]{,16}$)\d{1,5}[.]\d{1,4}[.]\d{1,6}$'
    vers = ['111.111.111', 
            '111111.1111.1111', 
            '11111.1111.111111', 
            '11111.1111.11111']
    ["{} Matches ? {}".format(v, "YES" if re.match(exp, v) else "NO" ) 
     for v in vers]
    

    输出

    ['111.111.111 Matches ? YES', 
     '111111.1111.1111 Matches ? NO', 
     '11111.1111.111111 Matches ? NO', 
     '11111.1111.11111 Matches ? YES']
    

答案 1 :(得分:1)

在开头添加一个前瞻,只有在1到16范围内时才能使用$锚定在最后:(?=^.{1,16}$)