Как сопоставить информацию из строки - PullRequest
2 голосов
/ 03 февраля 2010

У меня есть строка с номером версии. Я хочу прочитать номер версии из этого кода, чтобы сравнить его с другим кодом, который я использую. Я сделал код ниже, но не могу заставить его работать, кто-нибудь может увидеть проблему?

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

Я сделал это таким образом, так как мне нужно, чтобы числа в идентификаторе были разделены на группы, поскольку мне нужно сравнить третье число в идентификаторе с третьим числом в идентификаторе в другом файле.

Приведенные ниже ответы полезны, но, как я понял, я бы прочитал файл, вынул все числа и поместил их в список, так что все, что мне нужно было бы сделать, это сравнить два числа в списке. Извините, если вопрос не был ясен, но я не хочу, чтобы номер версии был строкой.

Хорошо, я внес пару изменений в код, ответ на который приведен ниже. Код выглядит следующим образом:

    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 ]

3 голосов
/ 03 февраля 2010

Почему регулярное выражение? Я должен использовать split ('') и использовать значение рядом с 'version' или проще:

print results.split(' ')[5]

Если вы должны использовать регулярное выражение, попробуйте:

rx = re.compile('version\s+([\d.]+)\s+')
rxx = rx.search(results)
if rxx:
    print rxx.group(1)
2 голосов
/ 03 февраля 2010
>>> 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'
2 голосов
/ 03 февраля 2010

это не регулярное выражение

>>> 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 голосов
/ 03 февраля 2010

Приведенные ниже ответы полезны, но, как я понял, я бы прочитал файл, вынул все числа и поместил их в список, так что все, что мне нужно было бы сделать, это сравнить два числа в списке.

Я собираюсь предположить, что формат версии является фиксированным (т. Е. 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
0 голосов
/ 03 февраля 2010

Я могу заметить пару вещей:

  • Вы говорите, что results - это строка, но вы просматриваете ее, поэтому l - это символ каждый раз.

  • re.match соответствует только в начале строки.Вместо этого используйте re.search.

0 голосов
/ 03 февраля 2010
>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...