import re
regex = re.compile(r"\[\[hero:([^:\]]*):?.*\]\]", flags=re.MULTILINE)
test_str = ("<div id=\"HeroesChanges\">\n"
" [[hero:abaddon]]\n"
" [[patchnote]] Aphotic Shield cast point reduced from 0.4 to 0.3\n"
" [[patchnote]] Borrowed Time scepter duration increased from 5/6/7 to 6/7/8\n"
" [[patchnote]] Level 15 Talent increased from +48 Mist Coil Heal/Damage to +50\n"
" [[patchnote]] Level 15 Talent changed from +6 Armor to +65 Damage\n"
" [[patchnote]] Level 20 Talent changed from +80 Damage to +8 Armor\n"
" [[patchnote]] Level 25 Talent increased from 375 AoE Mist Coil to 425\n"
" [[shard:abaddon_aphotic_shield:shardupgrade]]\n"
" [[shardnote]] Causes Mist Coil and Aphotic Shield to apply a Curse of Avernus stack on enemies. Increases base slow by 6%.\n"
" [[shardvideo]]\n"
" [[heroend]]\n\n"
" [[hero:alchemist]]\n"
" [[patchnote]] Unstable Concoction manacost reduced from 120 to 90/100/110/120\n"
" [[patchnote]] Unstable Concoction cooldown reduced from 22/20/18/16 to 16\n"
" [[patchnote]] Acid Spray damage increased from 15/20/25/30 to 20/25/30/35\n"
" [[patchnote]] Acid Spray first damage instance is now immediate rather than after a second\n"
" [[patchnote]] Gold bonus cap reduced from 18/22/26/30 to 18/21/24/27 (last hit count from 5/7/8/9 to 5/6/7/8)\n"
" [[patchnote]] If an ally already has a scepter buff or the item, it refunds them based on which version they have (either 4200 or 5800). \n"
" [[patchnote]] Alchemist granted scepter buffs provide the full stat bonuses.\n"
" [[patchnote]] Scepter damage/spell amp bonus reduced from 30/6 to 20/5\n"
" [[patchnote]] Level 20 Talent reduced from +30% Cleave to +25%\n"
" [[shard:alchemist_berserk_potion:shardnew]]\n"
" [[shardnote]] Grants Berserk Potion. Throws a potion at the target ally, applying a basic dispel and granting +50 Attack Speed and +40 HP Regen for 10 seconds. Cast Range: 800. Cooldown: 45. Manacost: 125. Can be used on self.\n"
" [[shardvideo]]\n"
" [[heroend]]\n\n"
" [[hero:ancient_apparition]]\n"
" [[patchnote]] Ice Blast max travel time improved from 2 seconds to 1.75\n"
" [[patchnote]] Chilling Touch manacost reduced from 30/50/70/90 to 30/45/60/75\n"
" [[shard:ancient_apparition_ice_vortex:shardupgrade]]\n"
" [[shardnote]] Causes Ice Vortex to deal 40 DPS and reduces attack speed by 20.\n"
" [[shardvideo]]\n"
" [[heroend]]\n\n"
" [[hero:antimage:scepterreworked]]\n"
" [[patchnote]] Mana Break max burn reduced from 1/2/3/4% to 1/1.8/2.6/3.4%\n"
" [[patchnote]] Level 15 Talent changed from +12 Agility to +8 Armor\n"
" [[patchnote]] Level 15 Talent reduced from +325 Blink Cast Range to +300\n"
" [[patchnote]] Level 20 Talent changed from Blink Uncontrollable Illusion to +0.1 Mana Void Damage Multiplier\n"
" [[patchnote]] <span class=\"reworked-scepter\">Scepter Rework:</span> Now grants Blink Fragment. Blinks an illusion at the target enemy or location and attacks them for 7 seconds. Uses Blink's Cast Range. Illusion cannot be controlled, deals 50% damage, takes 250%. Casting Counterspell also casts it on the Fragment illusion. Cooldown: 20. Manacost: 50\n"
" [[shard:antimage_counterspell:shardupgrade]]\n"
" [[shardnote]] Successful Counterspell creates an illusion attacking the caster for 5 seconds. Removes Counterspell manacost.\n"
" [[shardvideo]]\n"
" [[heroend]]")
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