I settle two matching rules for the names:
it, (name_pattern) !
"it," then name followed by " !"
-{3,} (name_pattern)\s
at least 3- characters followed by the name and an empty character
where name is any sequence of alphabetic character terminating with one or more digits, ([a-zA-Z]+\d+)
The pattern-matching is done simultaneously and needs to remove the "empty" match in the loop.
import re
text = """ Yay you made it, User1 ! — 25/03/2022 --------------- User2 joined the party. — 22/03/2022 --------------- Yay you made it, User3 ! — 29/03/2022 --------------- User4 joined the party. — 28/03/2022"""
# list of rules
rules = (r'it, ([a-zA-Z\d]+) !', r'-{3,} ([a-zA-Z]+\d+)\s')
#
regex = '|'.join(rules)
matches = [g1 if g2 == '' else g2 for g1, g2 in re.findall(regex, text)]
print(matches)
Output
['User1', 'User2', 'User3', 'User4']
EDIT
To avoid filtering the empty strings of the matched text one can use symbolic grouping (just groups with ids):
# symbolic grouping
rules = (r'it, (?=<g1>[a-zA-Z\d]+) !', r'-{3,} (?=<g2>[a-zA-Z]+\d+)\s')
regex = '|'.join(rules)
matches = [g.lastgroup for g in re.finditer(regex, text)]