import re def extract_mentions(message: str, triggerChar: str = "@"): # Escape triggerChar in case it's a regex special character triggerChar = re.escape(triggerChar) pattern = rf"<{triggerChar}([A-Z]):([^|>]+)" matches = re.findall(pattern, message) return [{"id_type": id_type, "id": id_value} for id_type, id_value in matches] def replace_mentions(message: str, triggerChar: str = "@", use_label: bool = True): """ Replace mentions in the message with either their label (after the pipe `|`) or their id if no label exists. Example: "<@M:gpt-4.1|GPT-4>" -> "GPT-4" (if use_label=True) "<@M:gpt-4.1|GPT-4>" -> "gpt-4.1" (if use_label=False) """ # Escape triggerChar triggerChar = re.escape(triggerChar) def replacer(match): id_type, id_value, label = match.groups() return label if use_label and label else id_value # Regex captures: idType, id, optional label pattern = rf"<{triggerChar}([A-Z]):([^|>]+)(?:\|([^>]+))?>" return re.sub(pattern, replacer, message)