Использование re.match() для исправления заглавных букв строк

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

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

Давайте будем считать, что слово было введено с случайно включенной клавишей Caps lock, если:

либо он содержит только заглавные буквы; либо все буквы, кроме первой, являются заглавными. В этом случае мы должны автоматически изменить регистр всех букв. Например, следует изменить регистр букв, образующих слова «hELLO», «HTTP», «z».

Напишите программу, которая применяет правило, упомянутое выше. Если правило не может быть применено, программа должна оставить слово без изменений.

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

 import re
word = input()
exp = r'[a-z] [A-Z] '
exp2 = r'[A-Z] '
if bool(re.match(word, exp)) or bool(re.match(word, exp2)):
    print(word[0].upper()   word[1:].lower())
else:
    print(word)
  
 Input:CAPS
Desired output: Caps
Current output: CAPS

Input:cAPS
Desired output: Caps
Current output: cAPS

Input:cAPSlOCK
Desired output:cAPSlOCK
Current output: cAPSlOCK
  

Комментарии:

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

2. Я немного изменил регулярное выражение в своем ответе на основе добавленного вами определения проблемы, так что слова, начинающиеся более чем с одной строчной буквы, не изменяются.

Ответ №1:

Первое регулярное выражение: r'[a-z] [A-Z] ' соответствует строке, начинающейся с одной или нескольких строчных букв, за которыми следует одна или несколько прописных букв.

Второе регулярное выражение r'[A-Z] ' соответствует строке, начинающейся с одной или нескольких заглавных букв.

Вы можете объединить их в: r'[a-z]?[A-Z] ' который соответствует строке, начинающейся с 0 или 1 строчной буквы, за которой следует одна или несколько заглавных букв.

Во-вторых, неправильный порядок параметров при вызове re.match() . Первым параметром должно быть регулярное выражение, вторым должна быть строка: re.match(exp,word)

Рабочая реализация:

 import re

word = input()
exp = r'[a-z]?[A-Z] '
if bool(re.match(exp,word)):
    print(word[0].upper()   word[1:].lower())
else:
    print(word)
  

Демо:https://repl.it/@glhr/55438600