2010-02-03 68 views
2

我有一个字符串,它有一个版本号。我想从该代码读取版本号,以便我可以将其与其他正在使用的代码进行比较。我有以下代码完成,但无法让它工作,任何人都可以看到问题?如何匹配字符串信息

print results 

    r = re.compile(r'(version\s*\s*)(\S+)') 

    for l in results: 
     m1 = r.match(l) 
     if m1: 
      ID=map(int,m1.group(2).split(".")) 
      l = r.sub(r'\g<1>' + '.'.join(['%s' % (v) for v in ID]), l) 
      print ID 

结果变量是:

Name Info Type Call version 1.0.40.437 Fri Oct 2 10:54:35 BST 2009 

我有它这样做的方式,我需要分成组的ID号码,因为我需要在ID比较3号到第三在另一个文件中的ID号码。

下面的答案是有用的,但我有它的方式会读取一个文件,并把所有的数字,并把它们放入一个列表,所以我将不得不做的是比较列表的两个数字。对不起,如果问题不清楚,但我不希望版本号是一个字符串。

好吧我对下面回答的代码做了一些修改。代码如下:

version = re.compile('version\s+([\d.]+)\s+') 
    ID = version.search(results) 
    if ID: 
     value = ID.group(1).split('.')[2] 

    self.assertEqual(BUILD_ID[2], int(value)) 

这并不创建我想要的列表,但它允许我比较2个值。

感谢您的帮助。

+0

什么类型是“结果”?如果它是一个字符串,你的循环遍历每个字符,而不是每个字。 – 2010-02-03 10:32:10

+0

'\ s * \ s *'相当于'\ s *'。你想在那里做什么? – 2010-02-03 10:33:47

回答

3

为什么正则表达式?我应该使用分裂(”“),并用旁边的值 '版本',或者simplier:

print results.split(' ')[5] 

如果必须正则表达式使用然后尝试:

rx = re.compile('version\s+([\d.]+)\s+') 
rxx = rx.search(results) 
if rxx: 
    print rxx.group(1) 
+0

+1如果格式是固定的,那么这里的第一种方法是最好的 – 2010-02-03 10:36:56

+1

'[\ d | \。]'不符合您的想法;你的意思是'[\ d。]'? – 2010-02-03 10:37:17

+0

'\ d'表示数字,'\ .'表示分隔版本信息中的数字的点。我认为'\ S'会更好,如果版本信息可以包含诸如TotalCommander已知的'7.50a'的信息: – 2010-02-03 10:39:53

0
>>> import re 
>>> results = "Name Info Type Call version 1.0.40.437 Fri Oct 2 10:54:35 BST 2009" 
>>> m = re.search("version ([^ ]+)", results) 
>>> if m: 
... version = m.group(1) 
... print "matched, found:", version 
... else: 
... print "didn't find a version" 
... 
matched, found: 1.0.40.437 
2

这里是一个非正则表达式的方式

>>> s="Name Info Type Call version 1.0.40.437 Fri Oct 2 10:54:35 BST 2009".split() 
>>> for n,i in enumerate(s): 
... if "version" in i: 
...  print s[n+1] 
... 
1.0.40.437 
>>> 
0

我能发现几件事情:

  • 你说results是一个字符串,但你通过它迭代 - 所以l是一个字符每次。

  • re.match只匹配开头的一个字符串。改为使用re.search

2
>>> r = re.compile(r'version (\S*)') 
>>> r.findall(results) 
['1.0.40.437'] 

非正则表达式的方式

>>> m=results.split() 
>>> m[m.index('version')+1] 
'1.0.40.437' 
0

下面的答案有用的,但我有它的方式会读取一个文件,并把所有的数字,并把它们放入一个列表,所以我将不得不做的是比较列表的两个数字。

我要去假设版本格式是固定的(即version.major.minor.revision)。

reVersion = re.compile('version\s+((((\d+)\.(\d+))\.(\d+)).(\S+))\s+', re.I) 

for result in results: 
    versionMatch = reVersion.match(result) 
    if versionMatch: 
     version = versionMatch.groups() 
     print(version[0]) # 1.0.40.437 full version 
     print(version[1]) # 1.0.40  version.major.minor - no revision 
     print(version[2]) # 1.0   version.major 
     print(version[3]) # 1   version 
     print(version[4]) # 0   major 
     print(version[5]) # 40   minor 
     print(version[6]) # 437   revision