2014-04-22 2 views
1

Existe-t-il un meilleur moyen de trouver des chiffres dans une chaîne qui commence par '_v' qui représente le numéro de version? Qu'est-ce que je veux est juste '001'Python trouver des chiffres avec '_v'

filename = 'greatv02_v001_jam.mb' 

parts = re.split('_v|\_',filename) 
>>['greatv02', '001', 'jam.mb'] 

b = re.findall(r'\d+', filename) 
>>['02', '001'] 

Y at-il un moyen de diviser une chaîne avec quelque chose le long de ces lignes?

parts = re.split('_v###_',filename) 

ou

parts = re.split('_v*_',filename) 

Répondre

1

Vous pouvez utiliser lookarounds:

>>> filename = 'greatv02_v001_jam.mb' 
>>> import re 
>>> re.findall(r'(?<=_v)\d+', filename) 
['001'] 
>>> 

>>> filename = 'greatv02_v001_av456jam.mb' 
>>> re.findall(r'(?<=_v)\d+', filename) 
['001'] 

>>> filename = 'greatv02_v001_v456jam.mb' 
>>> re.findall(r'(?<=_v)\d+', filename) 
['001', '456'] 
>>> 
1

laid, mais vous pouvez partition le nom du fichier deux fois

>>> filename.partition('_v')[2].partition('_')[0] 
'001' 
1

Utilisez le regroupement de regex comme ceci:

.*_v(\d+).* 

Démo:

>>> filename = 'greatv02_v001_jam.mb' 
>>> pattern = re.compile(r'.*_v(\d+).*') 
>>> re.search(pattern, filename).group(1) 
'001' 
1

Que diriez-vous du regex _v(?P<version>\d+).*:

>>> regex = re.compile("_v(?P<version>\d+).*") 
>>> r = regex.search(string) 

# List the groups found 
>>> r.groups() 
(u'001',) 

# List the named dictionary objects found 
>>> r.groupdict() 
{u'version': u'001'} 

# Run findall 
>>> regex.findall(string) 
[u'001'] 

# Run timeit test 
>>> setup = ur"import re; regex =re.compile("_v(?P<version>\d+).*");string="""greatv02_v00 ... 
>>> t = timeit.Timer('regex.search(string)',setup) 
>>> t.timeit(10000) 
0.005126953125 
Questions connexes