2016-04-28 14 views
5

Nel mio codice di test, voglio affermare che una stringa termina con un numero. Pronunciare il numero è compreso tra [0,3):python controlla se una stringa termina con un numero in un intervallo valido

assert_equals('/api_vod_asset/v0/assets/0', '/api_vod_asset/v0/assets/number') #valid 

assert_equals('/api_vod_asset/v0/assets/1', '/api_vod_asset/v0/assets/number') #valid 

assert_equals('/api_vod_asset/v0/assets/5', '/api_vod_asset/v0/assets/number') #invalid 

Come usare espressioni regolari o qualche altra tecnica per number?

risposta

3

Si sarebbe probabilmente desidera utilizzare assertRegex:

test_case.assertRegex('/api_vod_asset/v0/assets/0', '/api_vod_asset/v0/assets/[012]') 

quello precedente funziona nel caso di 0,3) intervallo [.Se non si desidera che tale restrizione, si sarebbe probabilmente desidera avere:

test_case.assertRegex('/api_vod_asset/v0/assets/0', '/api_vod_asset/v0/assets/[\d]') 

Tutto il codice precedente funziona dopo le seguenti righe sono state aggiunte al vostro frammento:

import unittest as ut 
test_case = ut.TestCase() 
0
>>> import re 
>>> match = re.search(r'/api_vod_asset/v0/assets/(\d+)', '/api_vod_asset/v0/assets/5') 
>>> match 
<_sre.SRE_Match object at 0x10ff4e738> 
>>> match.groups() 
('5',) 
>>> match.group(1) 
'5' 
>>> x = int(match.group(1)) 
>>> 0 <= x < 3 
False 
>>> 0 <= 2 < 3 
True 
1

voglio asserire che una stringa termina con un numero

if int(myString[-1]) in [0,1,2]: 
    do something... 
+1

questo viene a mancare su qualsiasi numero 10 o superiore ... –

+1

Ovviamente, poiché 'myString [-1]' fornisce solo l'ultimo carattere della stringa. Per ottenere 10 è necessario 'myString [-2:]'. Tuttavia, se vuoi controllare "qualsiasi numero di caratteri dopo l'ultimo"/"puoi usare' myString.split ('/') [- 1] '. Supponendo che le tue stringhe abbiano il numero dopo l'ultima barra. –

2

Se sarà sempre nello stesso posto nella stringa, è possibile utilizzare string.split

qualcosa di simile

def check_range(to_test, valid_range): 
    return int(to_test.split('/')[-1]) in range(valid_range[0], valid_range[1] + 1) 

quindi è possibile fare

check_range('/api_vod_asset/v0/assets/0', [0,3]) #True 
check_range('/api_vod_asset/v0/assets/1', [0,3]) #True 
check_range('/api_vod_asset/v0/assets/5', [0,3]) #False 
2

primo luogo, utilizzare una regex come \d+$ per ottenere qualsiasi numero (\d+) alla fine della stringa ($) ...

>>> m = re.search(r"\d+$", s) 

... quindi verificare se si dispone di un match e se il numero è nel range richiesto:

>>> m is not None and 0 <= int(m.group()) < 3 

Oppure utilizzare un range, se si preferisce questa notazione (supponendo limite superiore di 01.237.è esclusiva):

>>> m is not None and int(m.group()) in range(0, 3) 
+0

Il '' re' di Python supporta '\ D'? Quindi usa '\ D [0-3] $' :) – usr2564301

+0

@RadLexus Vuoi dire, come in "non un numero e poi uno qualsiasi da 0 a 3"? Sì, funzionerebbe, ammesso che si tratti solo di numeri a una cifra ... La mia soluzione è più generica, non si basa né sul numero di cifre né sui caratteri delimitanti, ma solo sulla posizione nella stringa, come è stato chiesto nella domanda. –

0

Regex:

import re 
reg_func = lambda x: bool(re.match(r'.*?[0123]$', x)) 

Python:

py_func = lambda x: x.endswith(tuple(map(str, range(4)))) 
0

Non sono sicuro che questo è il modo più elegante per fare questo, ma qui è quello che ho dovrebbe fare:

def is_finished_correctly(path): 
# The code seems self-explaining, ask if you need more detailed explanations 
    return (int(path.split("/")[-1]) in range(3)) 

assert(is_finished_correctly('/api_vod_asset/v0/assets/0')) 
0

Se non necessariamente desidera utilizzare regex, provate questo:

a = "hello" 
a[-1] = "o" # gives you the last character of a string 
try: 
    int(a[-1]) 
    print "last position is int" 
except: 
    print "last position is no int" 

int() solleva un'eccezione ValueError quando si passa un parametro in una base sbagliata, che è 10 per impostazione predefinita.

Si potrebbe ora fare qualcosa di simile:

path = '/api_vod_asset/v0/assets/0' 
try: 
    int(path[-1]) 
    # do all your stuff here 
except: 
    print "wrong path" 
    continue # (if you are in a loop) 

(Se si esegue un ciclo nel corso di molti sentieri, alcuni dei quali potrebbero non essere desidera si desidera accedere)

Problemi correlati