2016-05-25 2 views
-2

Я хочу, чтобы проверить суб письма, так что я написал этот код (Python 2.7):проверка на подстроки не работает

print text 
if ('e' or 'E') in text: 
    text = "%s"%float(text) 
    print text 

как предложено here.

текст представляет собой переменную, которая изменяется, curently имеет значение: 0E-7

Однако это не работает. Когда я отлаживаю, он перескакивает через блок if.

Почему условие является ложным?

ответ

3

Что задает ваш код: «Является ли значение ('e' or 'E') в text?» Когда вы оцениваете ('e' or 'E'), вы получаете 'e'. Вот исправление:

if ('e' in text) or ('E' in text): 
0

('e' or 'E') вычисляет 'e'. Итак, вы тестируете if 'e' in text:, что неверно здесь, поскольку E в 0E-7 является прописным.

Здесь вы можете увидеть его в интерактивном режиме:

>>> text = '0E-7'     # note that E is uppercase 
>>> ('e' or 'E') in text   # why is this false? 
False 
>>> ('E' or 'e') in text   # but true here? 
True 
>>> ('e' or 'E')     # aha! 'or' returns the first truthy value 
'e' 
>>> 'e' in text.lower()   # this fixes it 
True 
>>> any(c in text for c in 'eE') # another possible fix 
True 
>>> not set(text).isdisjoint('eE') # yet another way to do it 
True 
+0

('е' или 'E') принимает значение 'е', так как 'or' принимает первое значение, если это "truthy" – jcfollower

+0

@jcfollower: Да, Не могу поверить, что я сделал эту ошибку. Это то, что происходит, когда вас несколько месяцев подряд изгоняют в vbscript, вы начинаете изобретать семантику, которая существует ни на одном из языков. –

0

('e' or 'E') это логическое выражение, и оно оценивается как 'e'.

Мое предложение:

if any(char in text for char in ('e', 'E')): 
    # ...