版本和软件名称的正则表达式

时间:2012-06-27 11:24:08

标签: python regex

我有:

TYPO3 4.2 is installed on machine ...
Winamp is installed on machine ...
Winrar 3.20 is installed on machine ...

如何制作正则表达式来分隔句子中的软件包名称。上面有一个软件\版本的示例,但句子并不总是相同,有时也没有显示版本。任何提示怎么样?我找到了这个主题,但它仅适用于版本:Regular expression for version numbers

当我读到一些评论时,我忘了写一些像:

  • 软件版本没有标准格式,但它以点分隔

  • 软件名称位于

  • 版本之前
  • 我可能会遇到软件名称,但是有没有办法在某些文本中找到它的版本,而这些版本的结构与上面提到的句子不一样?
  • 以上句子不标准!

3 个答案:

答案 0 :(得分:6)

对于您显示的数据:

version = sentence.partition(" is installed on")[0]

不需要正则表达式,只需在“安装”之前取出所有内容。

答案 1 :(得分:0)

好吧,我们可以使用以下启发式方法:

  1. “已安装”是软件名称和版本结束的标记
  2. 版本不包含空格,只包含数字或点
  3. 版本之前的所有内容都是软件的名称
  4. 然后我们可以使用以下内容:

    (.*?) ([\d.]+ )?is installed
    

    第一组是软件名称,第二组是版本(如果存在)。

    快速PowerShell测试:

    PS> $strings = 'TYPO3 4.2 is installed on machine ...','Winamp is installed on machine ...', 'Winrar 3.20 is installed on machine ...'
    PS> $strings | %{ $null = $_ -match '(.*?) ([\d.]+ )?is installed'; "Software: " + $Matches[1] + ", version: " + $Matches[2] }
    Software: TYPO3, version: 4.2
    Software: Winamp, version:
    Software: Winrar, version: 3.20
    

答案 2 :(得分:0)

请提供有关数据的更多信息(请参阅我的评论)

如果程序名称总是一个字:
m = re.search(r'(?P<name>\S+?) (?P<version>([\d.]+ )?)', text)

如果句子以“是”或“已安装”一词开头:
m = re.search(r'(?P<name>(\S\s)+?)(?P<version>([\d.]+ )?)(is|installed)', text)

name = m.group('name').strip()
version = m.group('version').strip()