regex设置python中的组长度

regex设置python中的组长度,python,regex,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})

我有一个版本“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})

在开始处添加一个前瞻,仅当其在1-16范围内时才允许匹配,方法是使用
$
在末尾锚定:
(?=^.{1,16}$)

此处有两个要组合的正则表达式

  • ^[\d.]{,16}$
  • ^\d{1,5}[.]\d{1,4}[.]\d{1,6}$
  • 两者本身都是无效的,因为(1)可以匹配超过2个点,并且不遵守每个版本的单个长度限制。(2) 绝对不起作用,因为它超过了包括“.”在内的16个字符的字符串长度限制

    regex lookhead的一个鲜为人知的特性可用于组合(和ed)上述两个regex表达式,类似于

    ^(?=[\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']
    

    你确定你需要这是一个单一的正则表达式吗?将正则表达式设置为
    (\d+[。])(\d+[。])(\d+)
    ,然后分别进行其余的检查(查看版本范围是否正确以及len(字符串)是否在限制范围内)会更简单。感谢Abhijit regex look ahead解决了此问题。