какой ЯП?
можно находить блоки
<a>...</a>
а уже внутри них искать блоки
<b>...</b>
одной регуляркой, это......... м...
одной регуляркой даже скорее невозможно, только
если знать точное количество блоков <b>...</b>
или точнее... хотя бы максимальное их количество...
например максимум их может быть 4, тогда можно написать регулярку вида:
(?<=<a>)(\s*?<b>([^<]+)<\/b>)(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?
матчим и в каждом "матче" (совпадении) - если существует группа с нечетным номером, то в следующей группе с четным номером будет собственно значение, т.е. нам нужны только четные группы.
см,
regex101
PS:
можно было бы и так...
(?<=<a>)(\s*?<b>([^<]+)<\/b>){1,}
матчиться оно будет,
НО, вот группа будет только одна и писаться в нее будет последнее найденное значение.
как-то так....
UPDATE
взяв сгенерированный код в python с regex101, допиливаем "решение в лоб"
regex = r"(?<=<a>)(\s*?<b>([^<]+)<\/b>)(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?"
test_str = '''
<a>
<b>test11</b>
</a>
<a>
<b>test21</b>
<b>test22</b>
</a>
<a>
<b>test31</b>
<b>test32</b>
<b>test33</b>
</a>
<a>
<b>test41</b>
<b>test42</b>
<b>test43</b>
<b>test44</b>
</a>
<c>
<b>test51</b>
<b>test52</b>
</c>
'''
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
if (groupNum % 2 == 0) & (match.group(groupNum) != None):
print (match.group(groupNum) )
см.
пример