Как найти все слова, которые имеют только одну Заглавную букву в строке и состоят только из букв?

Как найти все слова, которые имеют только одну Заглавную букву в строке и состоят только из букв? Пример строк которые могут быть выделены выражением:

"Мама","авТо","гриБ",'Яблоко', 'яБлоко', 'ябЛоко', 'яблОко', 'яблоКо', 'яблокО'

Пример строк которые не должны быть выделены выражением:

"агент007" - содержит цифры
"стриж" - только строчные буквы
"ГТО", - более одной заглавной буквы
"Три богатыря" - содержит пробел, допустимы только буквы
result = re.findall(r'(\b[^\W\d_]+\b)([a-za-яё])([A-ZА-ЯЁ]{1}\w+)', str)
print(result)

Я подготовил три группы, но не понимаю, как именно их надо оформить, чтобы условие у меня все заработало. Нужно именно на библиотеке re подготовить ответ


Ответы (1 шт):

Автор решения: Алексей Р

Как я понял, подходят все последовательности строчных русских букв, содержащие внутри 1 заглавную. Тогда подойдет выражение [а-яё]*[А-ЯЁ][а-яё]*, где обязательную заглавную букву окружают слева и справа 0+ строчных букв, и это условие должно распространяться на всю строку целиком, а не на отдельный фрагмент (поэтому fullmatch).
Этим выражением выберутся также отдельные заглавные буквы наподобие А. Если требуется, чтобы букв было, например, не менее двух, то можно так:
[а-яё]+[А-ЯЁ][а-яё]*|[а-яё]*[А-ЯЁ][а-яё]+

import re

lst = ["Мама","авТо","гриБ",'Яблоко', 'яБлоко', 'ябЛоко', 'яблОко', 'яблоКо', 'яблокО',"агент007","стриж","ГТО","Три богатыря"]
r = r'[а-яё]*[А-ЯЁ][а-яё]*'

for s in lst:
    x = re.fullmatch(r,s)
    if x is not None:
        print(f'{s} годится')
    else:
        print(f'{s} не подходит')
Мама годится
авТо годится
гриБ годится
Яблоко годится
яБлоко годится
ябЛоко годится
яблОко годится
яблоКо годится
яблокО годится
агент007 не подходит
стриж не подходит
ГТО не подходит
Три богатыря не подходит
→ Ссылка