diff --git a/backend/apps/owasp/models/common.py b/backend/apps/owasp/models/common.py index 79193122f7..e095236a9c 100644 --- a/backend/apps/owasp/models/common.py +++ b/backend/apps/owasp/models/common.py @@ -2,7 +2,6 @@ from __future__ import annotations -import itertools import logging import re from urllib.parse import urlparse @@ -197,18 +196,26 @@ def get_leaders(self): return [] leaders = [] + # Compile regex patterns once per method call (before loop). + re_bracketed_pattern = re.compile( + r"[-*]\s{0,3}\[\s{0,3}([^\]\(]{1,200})(?:\s{0,3}\([^)]{0,100}\))?\s{0,3}\]" + ) + re_plain_pattern = re.compile(r"\*\s{0,3}([\w\s]{1,200})") + re_parenthetical_cleanup_pattern = re.compile(r"\s{0,3}\([^)]{0,100}\)\s{0,3}$") for line in content.split("\n"): - leaders.extend( - [ - name - for name in itertools.chain( - *re.findall( - r"[-*]\s*\[\s*([^(]+?)\s*(?:\([^)]*\))?\]|\*\s*([\w\s]+)", line.strip() - ) - ) - if name.strip() - ] - ) + stripped_line = line.strip() + names = [] + + names.extend(re_bracketed_pattern.findall(stripped_line)) + names.extend(re_plain_pattern.findall(stripped_line)) + + cleaned_names = [] + for raw_name in names: + if raw_name.strip(): + cleaned = re_parenthetical_cleanup_pattern.sub("", raw_name).strip() + cleaned_names.append(cleaned) + + leaders.extend(cleaned_names) return leaders