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

Есть текст:

text = 'qqqqqqqqqqqqqq >hello world< qqqqqqqqqqqqqq >houses and apartments< qqqqqqqqqq >hello kitty< qqqqqqqqqqqq'

Из которого мне нужно узнать где конкретно в тексте (получить индекс) выражения в треугольных скобках. Сложность заключается в том что мне нужно определенное выражения в треугольных скобках, с определенными словами, а именно: houses and apartments. При этом порядок эти слов может меняться местами: apartments and houses.

Что бы получить текст в треугольных скобках я делал так:

match = re.search(r"\>([a-z ]+)\<", text)

или так:

match = re.search(r'>(.*?)<', text)

И в первом и во втором случае я находил 'hello world'. Вот в чем вопрос, как мне найти текст в треугольных скобках с определенными словами (houses, and, apartments)?


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

Автор решения: Алексей Р

Используйте, например, метод re.finditer()

import re

text = 'qqqqqqqqqqqqqq >hello world< qqqqqqqqqqqqqq >houses and apartments< qqqqqqqqqq >hello kitty< qqqqqqq>apartments houses and <qqqqq'

for m in re.finditer(r'(?<=>)[^<>]*(?:houses|and|apartments)[^<>]*(?=<)', text):
    print(f'`{m[0]}` начинается с {m.span()[0]} символа')
`houses and apartments` начинается с 45 символа
`apartments houses and ` начинается с 101 символа
→ Ссылка
Автор решения: Глеб

А можно и без регулярок.

text = 'qqqqqqqqqqqqqq >hello world< qqqqqqqqqqqqqq >houses and apartments< qqqqqqqqqq >hello kitty< qqqqqqqqqqqq'
result = []
lst_first = [i for i, j in enumerate(text) if j == '>']
for i in lst_first:
    for j in range(i, len(text)):
        if text[j] == '<':
            result.append(text[i+1:j])
            break
print(result)
#['hello world', 'houses and apartments', 'hello kitty']
→ Ссылка