Поскольку вам не нужно находить каждое ключевое слово, но самые длинные из них, если они перекрываются, вы можете использовать регулярное выражение с findall
подходом.
Смысл в том, что высначала нужно отсортировать ключевые слова по длине в порядке убывания (поскольку в них есть пробелы), затем вам нужно экранировать эти значения, так как они содержат специальные символы, затем необходимо изменить границы слова, чтобы использовать однозначный границы слов, (?<!\w)
и (?!\w)
(обратите внимание, что \b
зависит от контекста).
Использование
pat = r'(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(Keywords,key=len,reverse=True))))
См. онлайн-тест Python :
import re
Keywords = ["Caden(S, A)", "Caden(a","Caden(.A))", "Caden.Q", "Caden.K", "Caden"]
rx = r'(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(Keywords,key=len,reverse=True))))
# => (?<!\w)(?:Caden\(S,\ A\)|Caden\(\.A\)\)|Caden\(a|Caden\.Q|Caden\.K|Caden)(?!\w)
strs = ["Caden(S, A) Charlotte.A, Caden.K;", "Emily.P Ethan.B; Caden(a", "Grayson.Q, Lily; Caden(.A))", "Mason, Emily.Q Noah.B; Caden.Q - Riley.P"]
for s in strs:
print(re.findall(rx, s))
Выход
['Caden(S, A)', 'Caden.K']
['Caden(a']
['Caden(.A))']
['Caden.Q']