Можно использовать шаблон с чередованием, совпадающим либо с aa bb
, либо с aa
, окруженным границами слов \b
, чтобы совпадение не являлось частью более длинного слова.
Для ссылки на группы в коде вы могли бы назвать их как entity_1
и entity_2
вместо использования номеров групп.
L oop результаты, используя, например, re.finditer и увеличивать счетчик, если найденная группа не является None.
Pattern
\b(?:(?P<entity_1>aa bb)|(?P<entity_2>aa))\b
Объяснение
\b
Граница слова (?:
Группа без захвата с альтернативами (?P<entity_1>aa bb)
Именованная группа entity_1 match aa bb
|
Или (?P<entity_2>aa)
Именованная группа сущность_2 совпадение aa
)
\b
Граница слова
Regex demo
Пример кода
import re
regex = r"\b(?:(?P<entity_2>aa bb)|(?P<entity_1>aa))\b"
test_str = "aa bb aa, aabb aa"
entity_1_count = 0
entity_2_count = 0
matches = re.finditer(regex, test_str)
for matchNum, match in enumerate(matches):
if match.group("entity_1") is not None:
entity_1_count += 1
if match.group("entity_2") is not None:
entity_2_count += 1
print(entity_1_count)
print(entity_2_count)
Выход
2
1