Вы regex (\S*[A-Z_]\S*[_]\S*)
использует \S*
, который будет соответствовать непробельному символу и повторять это 0+ раз, так что вы, например, также соответствует __
или A_
Вы можете использовать:
\b[A-Z]+_[A-Z_]*[A-Z]\b
Объяснение
\b
Граница слова
[A-Z]+
Совпадение с 1 + заглавными буквами
_
Подчеркивание совпадений
[A-Z_]*
Совпадение 0+ раз либо в верхнем регистре, либо в подчеркивании
[A-Z]
Соответствует символу в верхнем регистре
\b
Граница слова
re.search вернет первое место, где совпадает регулярное выражение. Вы можете использовать findall вместо:
import re
test_string = "test_string TEST_STRING TEST_string _TEST_STRING_ TESTSTRING ANOTHER_TEST_STRING"
p = re.compile(r"\b[A-Z]+_[A-Z_]*[A-Z]\b")
print(re.findall(p,test_string))
Результат
['TEST_STRING', 'ANOTHER_TEST_STRING']
См. Демоверсию regex | Python demo