【问题标题】:Regular expression for version number bigger than 1.18.10 [duplicate]大于 1.18.10 的版本号的正则表达式 [重复]
【发布时间】:2013-06-07 01:37:00
【问题描述】:

我需要验证应用程序的版本号是否大于 1.18.10。 在这种情况下,正则表达式应该是什么样子?

【问题讨论】:

  • 您确定正则表达式是解决此问题的最佳方法吗?
  • 要了解您为什么不想使用 RE,您应该阅读 automataRegular Expressions/NFA 上的课程以了解 RE 的真正含义。

标签: python regex


【解决方案1】:

不要为此使用正则表达式。用splittuple比较:

def is_recent(version):
    version_as_ints = (int(x) for x in version.split('.'))
    return tuple(version_as_ints) > (1, 18, 10)

然后检查is_recent("1.10.11")is_recent("1.18.12")

【讨论】:

  • 感谢马格努斯的反馈
  • @PreetKukreti 确定 :)
【解决方案2】:

似乎这个电池已经包含在distutils.version中的Python中:

from distutils.version import LooseVersion
LooseVersion("1.18.11") > LooseVersion("1.18.10")
#True

LooseVersion("1.2.11") > LooseVersion("1.18.10")
#False (note that "2">"18" is True)

LooseVersion("1.18.10a") > LooseVersion("1.18.10")
#True

这考虑了将版本号部分作为整数和非数字部分(例如字母扩展名)分开且正确地进行拆分和比较。 (如果你想要替代的行为(字典比较),你可以直接比较version_num.split(".")上的字符串元组)

请注意,还有一个 StrictVersion 变体会在版本字符串中的字母字符上引发异常 (ValueError)。另请参阅PEP386,它计划弃用两者,用NormalizedVersion 替换它们。

【讨论】:

    【解决方案3】:

    不要使用正则表达式,而是像:

    major, minor, patch = v.split('.')
    if int(major) > 1 or (int(major) == 1 and int(minor) >= 18):
        ...
    

    【讨论】:

      【解决方案4】:

      不确定为什么需要正则表达式,它不是进行复杂范围检查的特别好工具。

      我只是将split 字符串转换成一个三元素数组,然后检查每个元素,例如:

      (p1, p2, p3) = verstr.split(".")
      
      # May want to check they're numeric first.
      
      if int(p1) < 1: return False
      if int(p1) == 1:
          if int(p2) < 18: return False
          if int(p2) == 18:
              if int(p3) < 10: return False
      return True
      

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        相关资源
        最近更新 更多