Обновленный ответ
С момента моего первоначального ответа вы добавили семь новых требований к этому вопросу. Я расстраиваюсь, поскольку думаю, что вам нужно лучше понять суть проблемы, с которой вы столкнулись, прежде чем просить о дополнительной помощи.
Однако я добавлю еще один фрагмент, который может направить вас на правильный путь. Похоже, вы пытаетесь найти правильные математические выражения. Следующий код сделает это:
def check_valid(data):
errors = (SyntaxError, NameError)
try:
eval(data)
except errors:
for i in data.split():
try:
eval(i)
except errors:
return None
return data
test = ["4++2", "4+-2", "4.0 + 2", "3.88327 - $3.4", "a + 24", "2+6", "4+/3"]
for t in test:
try:
assert check_valid(t)
print(f"{t} valid")
except AssertionError:
print(f"{t} not valid")
Выход
4++2 valid
4+-2 valid
4.0 + 2 valid
3.88327 - $3.4 not valid
a + 24 not valid
2+6 valid
4+/3 not valid
В Python, + может повторяться любое количество раз и при этом оставаться действительным математическим выражением, так как оно просто изменяется знак целого числа неоднократно.
Оригинальный ответ
Есть несколько способов приблизиться к этому. Учитывая ваш пример, в вашей логике есть несколько fl aws c:
- "4.0" - это не цифра c. Numeri c в числовом формате 0-9 или Unicode. Документы здесь
- Вы проверяете строку по другой строке с ключевым словом
in
. С вашей первой примерной строкой последовательность «4.0» явно не в последовательности «* ^ - + / ()». Пример того, как это работает:
>>> "4.0" in "asdf4.012345"
True
>>> "4.0" in "0.4"
False
Быстрое исправление, использующее аналогичные логи c, состояло бы в том, чтобы проверять символ за символом, а не слово за словом, и объединять два условия с and
. Попробуйте следующий фрагмент:
def check_valid(data):
for word in data.split():
for character in word:
if character not in "*^-+/()." and not character.isnumeric():
return None
return data
test = ["4.0 + 2", "3.88327 - $3.4", "a + 24", "22 66", "2+6"]
for t in test:
print(f"Test: {check_valid(t)}")
Вывод
Test: 4.0 + 2
Test: None
Test: None
Test: 22 66
Test: 2+6
Примечание: Я изменил некоторые имена, чтобы более точно следовать python рекомендациям по стилю кода.