import re
regex = re.compile(r"(<(span).+?><(strong|em)>(.+?)<\/\3><\/\2>)", flags=re.MULTILINE)
test_str = "<p>Alligators much like birds, have been shown to exhibit unidirectional movement of air through their lungs. Most other amniotes are believed to exhibit bidirectional, or tidal breathing. For <span style=\"color: #3a9ee3;\"><strong>alligator</strong></span> tidal breathing <span style=\"color: #3a9ee3;\"><strong>alligator</strong></span> animal, such as a mammal, air flows into and out of the <span style=\"color: #169179;\"><em>alligators</em></span> lungs through alligator branching bronchi which terminate in small <em>alligator</em> dead-end chambers called alveoli. As the alveoli represent <span style=\"color: #3a9ee3;\"><strong>Lion</strong></span> dead-ends to flow, the inspired air must move back out the same way it came in. In contrast, air in <span style=\"color: #3a9ee3;\"><strong>alligator</strong></span> lungs makes a circuit, moving in only one direction through the parabronchi. The <span style=\"color: #3a9ee3;\"><strong>alligators</strong></span> lungs are no joke! The air first enters the outer branch, moves through the parabronchi, and exits <span style=\"color: #3a9ee3;\"><strong>alligators</strong></span> the lung through the inner branch. Oxygen alligator exchange takes place <span style=\"color: #3a9ee3;\"><strong>Alligators</strong></span> in extensive vasculature around the alligator.</p>"
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html