Возможно, это еще больше упростится, и я предполагаю, что \n
в вашем примере строки является буквальным символом новой строки.
Это должно соответствовать всем вашим вариантам использования. Он начинается с поиска любого количества символов, которые не SCENE
предшествуют :
, затем он находит любые символы после двоеточия, которые не следуют за новой строкой и предшествуют :
, а затем последний .
естьвероятно, наоборот, но последний символ не был должным образом сопоставлен, потому что за ним непосредственно следовал отрицательный взгляд.
findall( r"([A-Z]+(?<!SCENE):(?:[\s\S](?!\n[A-Z]+:))+.)", text )
https://regex101.com/r/NwdUcR/2
РЕДАКТИРОВАТЬ: я понимаю, что выше можетне совсем то, что вы ищете. Если вы хотите сопоставить только буквы перед двоеточием, вы можете использовать это:
findall( r"([A-Z]+(?<!SCENE)):", text )