【问题标题】:Regular expression to extract software version from the given text?从给定文本中提取软件版本的正则表达式?
【发布时间】:2021-03-02 15:52:24
【问题描述】:

我正在寻找可以从字符串中提取软件版本的正则表达式。几个样本看起来像

1) 'ABCD 2.3.4' 
o/p: 2.3.4

2) 'ANDROID 4.4 KIT KAT SELFIX'
o/p: 4.4

3) '0.1.0-D-20170309.1502'
o/p: 0.1.0

4) 'CONTIXO-LA703-20180915-v1.0'
o/p: 1.0

我的正则表达式条件失败并且无法满足所有这些条件。 这是我的正则表达式:

''.join(re.findall("[0-9.]", txt))

这只能满足前两种情况。如何从以上所有案例中提取软件版本?

注意:我的旧问题不具体,没有解决方案就关闭了。我删除了问题并添加了一个新问题。希望这个符合标准。

【问题讨论】:

  • 在示例 3 中,版本可以是 0.1.020170309.1502。你怎么知道哪个是版本号? (对于人类来说,第二个显然是时间戳)
  • 在这种情况下,数字的长度会有所不同
  • 也许这样的事情会起作用\d{1,3}\.\d{1,3}(?:\.\d+)?\b 它适用于您提供的示例,但它可能不适用于某些情况。

标签: python python-3.x regex


【解决方案1】:

在 Python3 中: 使用以下,如果存在多个匹配项,则获取第一个。

import re
re.findall('\d+(?:\.\d+)+', '3) \'0.1.0-D-20170309.1502\'')[0]
'0.1.0'
re.findall('\d+(?:\.\d+)+', '2) \'ANDROID 4.4 KIT KAT SELFIX\'')[0]
'4.4'

说明:为上述添加详细说明。

\d+          ##Looking for digits 1 or more occurrences here.
(?:\.\d+)+   ##Starting a non-capturing group which looks for a literal DOT followed by one or more
             ##digits occurrences AND one or more occurrences of this non-capturing group with `+` it will match.


根据第四只鸟的好评论,您也可以尝试以下:

(?<![\d-])\d+(?:\.\d+)+

【讨论】:

  • 为什么在示例 3 中获得双重匹配时将其标记为答案?
  • @RufusVS,它现在已修复,它根据 OP 显示的示例提供预期结果,谢谢。
  • @RufusVS 我得到了核心逻辑,无论选择哪种形式,列表都是不言自明的。所以我标记并接受了解决方案
猜你喜欢
  • 2016-12-22
  • 2020-01-29
  • 2017-10-08
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多