2016-04-28 17 views
5

Trong mã thử nghiệm của tôi, tôi muốn khẳng định rằng một chuỗi kết thúc bằng một số. Giả sử số nằm giữa [0,3):python kiểm tra xem chuỗi có kết thúc bằng một số trong dải ô hợp lệ

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 

Cách sử dụng cụm từ thông dụng hoặc một số kỹ thuật khác cho number?

Trả lời

3

Bạn có lẽ sẽ muốn sử dụng assertRegex:

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

Phần trên hoạt động trong trường hợp [0,3).Nếu bạn không muốn hạn chế đó, bạn có thể sẽ muốn có:

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

Tất cả các mã trên hoạt động sau khi những dòng sau đã được thêm vào đoạn mã của bạn:

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

Tôi muốn khẳng định rằng một chuỗi kết thúc bằng một số

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

này không thành công trên bất kỳ số 10 hoặc lớn hơn ... –

+1

Tất nhiên, vì 'myString [-1]' chỉ cung cấp cho bạn char cuối cùng của chuỗi. Để có được 10 bạn cần 'myString [-2:]'. Tuy nhiên, nếu bạn muốn kiểm tra 'bất kỳ số ký tự nào sau'/'cuối cùng, bạn có thể sử dụng 'myString.split ('/') [- 1]' để thay thế. Giả sử rằng các chuỗi của bạn sẽ có số sau dấu gạch chéo cuối cùng. –

2

Nếu nó sẽ luôn luôn ở cùng một vị trí trong chuỗi, bạn có thể sử dụng string.split

cái gì đó như

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

thì bạn có thể làm

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

Thứ nhất, sử dụng một regex như \d+$ để có được bất kỳ số lượng (\d+) ở phần cuối của chuỗi ($) ...

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

... sau đó kiểm tra xem bạn có một trận đấu và liệu số nằm trong khoảng yêu cầu:

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

Hoặc sử dụng một range, nếu bạn thích ký hiệu này (giả sử trên ràng buộc của 01.237.là độc quyền):

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

Có hỗ trợ 're' của Python' \ D' không? Sau đó, sử dụng '\ D [0-3] $' :) – usr2564301

+0

@RadLexus Bạn có nghĩa là, như trong "không phải là một số và sau đó bất kỳ 0 đến 3"? Vâng, điều đó có hiệu quả, miễn là chúng ta chỉ xử lý các số có một chữ số ... Giải pháp của tôi tổng quát hơn, không dựa vào số chữ số hay ký tự dấu phân cách mà chỉ là vị trí trong chuỗi, như được hỏi trong câu hỏi. –

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

Tôi không chắc chắn rằng đây là cách thanh lịch nhất để làm điều này nhưng đây là những gì tôi sẽ làm:

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

Nếu bạn không nhất thiết muốn sử dụng regex, hãy thử điều này:

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() tăng giá trị ValueError khi bạn chuyển một tham số sai cơ số là 10 theo mặc định.

Bây giờ bạn có thể làm một cái gì đó như thế này:

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) 

(Nếu bạn vòng qua nhiều con đường, một số trong đó có thể không muốn bạn muốn truy cập)

Các vấn đề liên quan