2016-04-28 12 views
5

W moim kodzie testu, chcę potwierdzić, że ciąg kończy się liczbą. Twierdzą, że liczba ta jest między [0,3):python sprawdź, czy koniec łańcucha z numerem w zakresie prawidłowym

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 

Jak używać wyrażeń regularnych lub jakąś inną technikę number?

Odpowiedz

3

Będziesz prawdopodobnie chcesz użyć assertRegex:

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

powyższy pracuje się w przypadku [0,3) zasięgu.Jeśli nie chcesz tego ograniczenia, to prawdopodobnie chcą mieć:

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

przede wszystkim kod działa po następujące wiersze zostały dodane do fragmentu:

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

chcę twierdzić, że ciąg kończy się numerem

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

To nie działa na dowolnej liczbie 10 lub więcej ... –

+1

Oczywiście, ponieważ 'myString [-1]' daje tylko ostatni znak ciągu. Aby uzyskać 10, potrzebujesz 'myString [-2:]'. Jeśli jednak chcesz sprawdzić "dowolną liczbę znaków po ostatnim"/", możesz zamiast tego użyć' myString.split ('/') [- 1] '. Zakładając, że twoje struny będą miały numer po ostatnim ukośniku. –

2

Jeśli to będzie zawsze w tym samym miejscu w ciągu, można użyć string.split

coś podobnego

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

następnie można zrobić

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

pierwsze, należy użyć wyrażenia regularnego jak \d+$ uzyskać dowolną liczbę (\d+) na końcu łańcucha ($) ...

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

... a następnie sprawdzić, czy masz spotkanie i czy liczba mieści się w wymaganym zakresie:

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

lub użyć range, jeśli wolisz to notację (zakładając, że górna granica [0,3) jest wyłącznym):

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

Czy obsługa Pythona 're' obsługuje' \ D'? Następnie użyj '\ D [0-3] $' :) – usr2564301

+0

@RadLexus Masz na myśli, jak w "nie numer, a potem dowolne od 0 do 3"? Tak, to by działało, pod warunkiem, że mamy do czynienia tylko z liczbami jednocyfrowymi ... Moje rozwiązanie jest bardziej ogólne, polegając nie na liczbie cyfr ani ograniczających znakach, ale na pozycji w łańcuchu, jak to było zadawane w pytaniu. –

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

nie jestem pewien, że jest to najbardziej elegancki sposób to zrobić, ale tutaj jest to, co zrobiłby:

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

Jeśli nie koniecznie chcą, aby użyć wyrażenia regularnego, spróbuj tego:

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() podnosi ValueError kiedy przechodzą parametr w niewłaściwej podstawy, która wynosi 10 domyślnie.

Można teraz zrobić coś takiego:

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) 

(Jeśli pętla przez wiele ścieżek, z których niektóre mogą nie być chcą chcesz uzyskać dostęp)

Powiązane problemy