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

Нужна помощь с решением регулярных выражений.
Задача проста, нужно найти все слова, которые имеют только одну Заглавную букву в строке и не имеют числа.

Я пытался что-то вроде такого сделать, но безуспешно:

import re
pattern = r"\b\w[а-яА-ЯёЁ]\w+(?![0-9])\b"
result = re.findall(pattern, 'Яблоко яБлоко ябЛоко яблОко яблоКо яблокО яблоко7 яблоко')
print(result)

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


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

Автор решения: Wiktor Stribiżew

Если вы хотите использовать регулярные выражения, установите библиотеку PyPi regex с помощью pip install regex используйте

import regex
pattern = r"\b\p{Ll}*\p{Lu}\p{Ll}*\b"
text = 'Яблоко яБлоко ябЛоко яблОко яблоКо яблокО яблоко7 яблоко'
result = regex.findall(pattern, text)
print(result)
# => ['Яблоко', 'яБлоко', 'ябЛоко', 'яблОко', 'яблоКо', 'яблокО']

См. пример выполнения кода.

Если регулярные выражения использовать необязательно, вы можете использовать

import re, sys
uc_letters = [chr(i) for i in range(sys.maxunicode) if chr(i).isupper()]
text = 'Яблоко яБлоко ябЛоко яблОко яблоКо яблокО яблоко7 яблоко'
print( [slovo for slovo in text.split() if all(c.isalpha() for c in slovo) and len([c for c in slovo if c in uc_letters]) == 1 ] )
# => ['Яблоко', 'яБлоко', 'ябЛоко', 'яблОко', 'яблоКо', 'яблокО']

См. пример кода.

Подробности:

  • uc_letters - список всех заглавных букв Юникода
  • [slovo for slovo in text.split()... - разбивает строку на слова по пробельным символам, а затем оставляет только те, которые
  • if all(c.isalpha() for c in slovo) and... состоят целиком из букв и
  • len([c for c in slovo if c in uc_letters]) == 1 ] в которых имеется только одна заглавная буква.
→ Ссылка