32 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Python
		
	
	
	
		
		
			
		
	
	
			32 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Python
		
	
	
	
| 
								 | 
							
								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)
							 |