как считать "естественные" появления определенных объектов в строке python - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть следующая строка:

sentence = 'aa bb aa, aabb aa.'

Я ищу способ подсчитать следующие сущности:

entity_1 = 'aa'
entity_2 = 'aa bb'

конечный результат должен быть следующим: entity_1 count = 2 (только «aa» и «aa.», «aa» в «aa bb» не должно учитываться, поскольку «aa bb» является его собственной сущностью) entity_2 count = 1 (только 'aa bb') Я пытался использовать sentence.split(" ").count(entity) и sentence.count(entity), но оба результата приводят к неправильному счету. Есть идеи?

1 Ответ

0 голосов
/ 30 апреля 2020

Можно использовать шаблон с чередованием, совпадающим либо с 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
...