2016-04-28 3 views
5

В моем тестовом коде я хочу утверждать, что строка заканчивается номером. Скажем, число между [0,3):python проверить, заканчивается ли строка с номером в допустимом диапазоне

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 

Как использовать регулярные выражения или какой-либо другой метод для number?

ответ

3

Вы, вероятно, хотите использовать assertRegex:

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

Тот выше, работает в случае [0,3) диапазоне.Если вы не хотите, что ограничение, вы, вероятно, хотите иметь:

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

Все выше код работает после того, как следующие строки, которые были добавлены к вашему сниппета:

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

Я хочу утверждать, что строка заканчивается номером

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

Это не будет работать на любом количестве 10 или больше ... –

+1

Конечно, поскольку 'myString [-1]' дает вам только последний символ строки. Для получения 10 вам понадобится 'myString [-2:]'. Однако, если вы хотите проверить «любое количество символов после последнего» /, вы можете вместо этого использовать 'myString.split ('/') [- 1]'. Предполагая, что ваши строки будут иметь номер после последней косой черты. –

2

Если он всегда будет на том же месте в строке, вы можете использовать string.split

что-то вроде

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

то вы можете сделать

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

Во-первых, использовать регулярное выражение как \d+$ получить любое количество (\d+) в конце строки ($) ...

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

... проверьте, есть ли вы матч и является ли число находится в требуемом диапазоне:

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

или использовать range, если вы предпочитаете это обозначение (при условии, верхняя граница [0,3) является эксклюзивным):

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

Поддерживает ли '' '' '' '' '' '' 'D'? Затем используйте '\ D [0-3] $' :) – usr2564301

+0

@RadLexus Вы имеете в виду, как в «не число, а затем любое из 0 до 3»? Да, это сработало бы, если бы мы имели дело только с одноразрядными числами ... Мое решение более общее, не полагаясь ни на число цифр, ни на разделительные символы, а на позицию только в строке, как было задано в вопросе. –

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

Я не уверен, что это самый элегантный способ сделать это, но вот что я будет:

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

Если вы не обязательно хотите использовать регулярные выражения, попробуйте следующее:

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() вызывает ValueError при передаче параметра в неправильном основании, которое является 10 по умолчанию.

Теперь вы могли бы сделать что-то вроде этого:

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) 

(Если петля над многими путями, некоторые из которых могут быть не хотят, чтобы вы хотите получить доступ)

Смежные вопросы