Я согласен с другими, лучше использовать парсер xml здесь. Но чтобы исправить то, что у вас есть ...
Вам не хватает знака вопроса. регулярные выражения жадные по умолчанию. Они хватают столько, сколько могут. Чтобы сделать их не жадными, вам нужно добавить знак вопроса после части, для которой вы хотите быть не жадной. Это регулярное выражение даст вам то, что вы хотите:
<SW-VARIABLE>\s*<SHORT-NAME>([^<]*)</SHORT-NAME>.*?<SW-ARRAYSIZE>\s*<VF>([^<]*)</VF>\s*</SW-ARRAYSIZE>.*?<(?:/(?!<SW-VARIABLE>)[^/]*?)SW-VARIABLE>
у вас правильно был вопросительный знак после
</SW-ARRAYSIZE>.*
, но вы пропустили его после
</SHORT-NAME>.*
.
Я думаю, вы хотите захватить только содержимое двух '. *?' S. Если это так, я бы поместил их в группы и извлекал группы в коде для работы с ними. Тогда регулярное выражение станет:
<SW-VARIABLE>\s*<SHORT-NAME>(?P<sn>[^<]*?)</SHORT-NAME>.*?<SW-ARRAYSIZE>\s*<VF>(?P<vf>[^<]*?)</VF>\s*</SW-ARRAYSIZE>.*?<(?:/(?!<SW-VARIABLE>)[^/]*?)SW-VARIABLE>
с двумя именами групп: sn и vf. demo
Ваш python код для получения названных групп станет:
matches= re.search(regex, string1)
print("shortName: ", matches.group('sn'))
print("vf: ", matches.group('vf'))