С двумя флагами
def find_sec_let_num_bef(text): out = 'none' f_was_letter = f_was_digit = False for ch in text: if ch.isalpha(): if f_was_letter and f_was_digit: out = ch break else: f_was_letter = True elif ch.isdigit(): f_was_digit = True return out
С одной переменной (полная версия)
def find_sec_let_num_bef(text): out = 'none' state = 0 # (0 no, 1 no let1, 2 no dig, 3 let1 dig let2, 4 dig let1 let2) for ch in text: if state == 0: if ch.isalpha(): state = 1 elif ch.isdigit(): state = 2 elif state == 1: if ch.isdigit(): state = 3 elif state == 2: if ch.isalpha(): state = 4 elif state == 3: if ch.isalpha(): out = ch break elif state == 4: if ch.isalpha(): out = ch break return out
С одной переменной (сокращённая версия)
def find_sec_let_num_bef_(text): out = 'none' state = 0 # (0 no, 1 no let1, 2 no dig, 3 (let1 dig | dig let1) dig2) for ch in text: if state == 0: if ch.isalpha(): state = 1 elif ch.isdigit(): state = 2 elif state == 1: if ch.isdigit(): state = 3 elif state == 2: if ch.isalpha(): state = 3 elif state == 3: if ch.isalpha(): out = ch break return out
Юнит-тесты, через которые прогонял функции
Файл flagex_test.py
#!/usr/bin/env python3 import pytest from flagex import find_sec_let_num_bef as f @pytest.mark.parametrize( 'io', ( ('a1!', 'none'), ('a!1', 'none'), ('!a1', 'none'), ('!1a', 'none'), ('1!a', 'none'), ('abc1!', 'none'), ('abc!1', 'none'), ('ab1c!', 'c'), ('ab1!c', 'c'), ('ab1!c2d', 'c'), ('1ab', 'b'), ('1abc', 'b'), ('12ab', 'b'), ('12abc', 'b'), ('12a3b', 'b'), ('1;;;;ab', 'b'), ('1;;;;abc', 'b'), ('1;;a;;b', 'b'), ('1;;a;;bc', 'b'), ('a,123456789b', 'b'), ('a,1234@56789b', 'b'), ('aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa', 'j'), (',;1abc bbb ccclkj!@# $lll kkk', 'b'), ('bbb ccclkj!@# $lll kkk123::@', 'none'), ) ) def test_values(io): i, o = io assert f(i) == o
Чтобы запустить тесты для функции, нужно создать файл flagex.py и в него записать функцию find_sec_let_num_bef().
Команда для запуска тестов в директории
python3 -m pytest
Пример запуска тестов
[guest@localhost flagex]$ python3 -m pytest
================================== test session starts ===================================
platform linux -- Python 3.6.1, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /home/guest/prog/tests/py/flagex
plugins: mock-1.6.0, cov-2.4.0, spec-1.1.0, pep8-1.0.6, flakes-1.0.1
collected 24 items
flagex_test.py ........................ [100%]
=================================== 24 passed in 0.05s ===================================
[guest@localhost flagex]$