如何匹配字符串中的信息

时间:2010-02-03 10:24:08

标签: python search string

我有一个版本号的字符串。我想从这段代码中读取版本号,这样我就可以将它与我正在使用的其他代码进行比较。我在下面完成了代码,但无法使其正常工作,有人能看到问题吗?

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个值。

感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

为何选择regexp?我应该使用split('')并使用'version'旁边的值,或者更简单:

print results.split(' ')[5]

如果必须使用正则表达式,请尝试:

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

答案 1 :(得分: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
>>>

答案 2 :(得分: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'

答案 3 :(得分: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

答案 4 :(得分:0)

我可以发现一些事情:

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

  • re.match仅匹配字符串的开头。请改用re.search

答案 5 :(得分: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