2010-02-03 8 views
2

J'ai une chaîne qui a un numéro de version. Je veux lire le numéro de version de ce code pour pouvoir le comparer avec d'autres codes que j'utilise. J'ai le code fait ci-dessous, mais ne peut pas le faire fonctionner, quelqu'un peut-il voir le problème?Comment faire correspondre les informations d'une chaîne

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 

la variable des résultats est la suivante:

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

Je l'ai fait de cette façon que j'ai besoin les chiffres de l'ID séparés en groupes que je dois comparer le 3ème numéro dans l'ID au troisième numéro dans l'ID dans un autre fichier. Les réponses ci-dessous sont utiles, mais comme je l'ai fait, je lisais un fichier, je prenais tous les nombres et je les rangeais dans une liste, donc tout ce que je devais faire était de comparer les deux nombres de la liste. Désolé si la question n'était pas claire mais je ne veux pas que le numéro de version soit une chaîne.

Okay J'ai apporté quelques modifications au code qui a été répondu ci-dessous. Le code est le suivant:

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)) 

Cela ne crée pas la liste que je voulais mais cela me permet de comparer les 2 valeurs.

Merci pour toute l'aide.

+0

De quel type s'agit-il? Si c'est une chaîne, votre boucle traverse chaque caractère, pas chaque mot. –

+0

'\ s * \ s *' est équivalent à '\ s *'. Qu'essayais-tu de faire là? –

Répondre

3

Pourquoi regexp? Je devrais utiliser split (» «) et la valeur d'usage à côté de 'version', ou simplier:

print results.split(' ')[5] 

Si vous devez utiliser regexp essayez:

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

+1 La première façon est la meilleure si le format est corrigé –

+1

'[\ d | \.]' Ne fait pas ce que vous pensez; Vouliez-vous dire '[\ d.]'? –

+0

'\ d' signifie chiffre, et' \ .' signifie point qui sépare les nombres dans les informations de version. Je pense que '\ S' serait mieux si les informations de version peuvent contenir des informations comme' 7.50a' connues de TotalCommander :) –

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

est ici une façon non regex

>>> 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

je peux repérer un certain nombre de choses:

  • Vous dites results est une chaîne, mais nous parcourons - donc l est un personnage à chaque fois.

  • re.match correspond uniquement au commençant d'une chaîne. Utilisez re.search à la place.

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

manière non regexp

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

Les réponses ci-dessous sont utile, mais comme je l'avais lu, je lirais un fichier et j'en sortirais tous les numéros pour les mettre dans une liste, donc tout ce que je devrais faire serait de comparer les deux nombres de la liste.

Je vais supposer que le format de version est fixe (ie. 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 
Questions connexes