【问题标题】:Python regex to extract version from a stringPython正则表达式从字符串中提取版本
【发布时间】:2014-10-21 07:15:20
【问题描述】:

字符串是这样的:(\n用来换行)

MySQL-vm
Version 1.0.1

WARNING:: NEVER EDIT/DELETE THIS SECTION

我想要的只是 1.0.1 。

我正在尝试re.search(r"Version+'([^']*)'", my_string, re.M).group(1),但它不起作用。

re.findall(r'\d+', version) 给了我一个我必须再次附加的数字数组。

如何改进正则表达式?

【问题讨论】:

  • 我建议首先解析字符串并仅在相关部分应用正则表达式。会让您的生活更轻松。
  • "Version+" 表示匹配V-e-r-s-i-o,然后匹配一个或多个ns。
  • 它只重复n 一次或多次。

标签: python regex


【解决方案1】:

使用下面的正则表达式并从组索引 1 中获取版本号。

Version\s*([\d.]+)

DEMO

>>> import re
>>> s = """MySQL-vm
... Version 1.0.1
... 
... WARNING:: NEVER EDIT/DELETE THIS SECTION"""
>>> re.search(r'Version\s*([\d.]+)', s).group(1)
'1.0.1'

说明:

Version                  'Version'
\s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                         more times)
(                        group and capture to \1:
  [\d.]+                   any character of: digits (0-9), '.' (1
                           or more times)
)                        end of \1

【讨论】:

  • +1 获取 DEMO 网站信息。没听说过这个:)
  • 是的,这是一个很棒的网站。你可以在那里检查你的正则表达式。
【解决方案2】:

您也可以尝试使用Positive Look behind,它不消耗字符串中的字符,而只断言是否可能匹配。在下面的正则表达式中,您不需要 findAllgroup 函数。

(?<=Version )[\d.]+

Online demo

解释:

  (?<=                     look behind to see if there is:
    Version                  'Version '
  )                        end of look-behind
  [\d.]+                   any character of: digits (0-9), '.' (1 or more times)

【讨论】:

  • 代码是从regex101复制过来的。我对 Python 一无所知。
  • 您正在使用相同的站点进行演示。可能是代码不正确,但它适用于正则表达式测试。
  • 谢谢,我已经从答案中删除了代码部分。
【解决方案3】:
(?<=Version\s)\S+

试试这个。与re.findall一起使用。

x="""MySQL-vm
  Version 1.0.1

  WARNING:: NEVER EDIT/DELETE THIS SECTION"""

print re.findall(r"(?<=Version\s)\S+",x)

输出:['1.0.1']

查看演示。

http://regex101.com/r/dK1xR4/12

【讨论】:

    【解决方案4】:

    https://regex101.com/r/5Us6ow/1

    位递归以匹配 1、1.0、1.0.1 等版本:

    def version_parser(v):
        versionPattern = r'\d+(=?\.(\d+(=?\.(\d+)*)*)*)*'
        regexMatcher = re.compile(versionPattern)
        return regexMatcher.search(v).group(0)
    

    【讨论】:

      【解决方案5】:

      老问题,但没有一个答案涵盖诸如Version 1.2.3.(以点结尾)或Version 1.2.3.A(以非数字值结尾)等极端情况 这是我的解决方案:

      ver = "Version 1.2.3.9\nWarning blah blah..."
      print(bool(re.match("Version\s*[\d\.]+\d", ver)))
      

      【讨论】:

        猜你喜欢
        • 2013-02-24
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        相关资源
        最近更新 更多