Как найти все вхождения подстрок, кроме первых трех, используя REGEX? - PullRequest
0 голосов
/ 06 апреля 2020

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

"ATAG: AAAABTAG: BBBBCTAG: CCCCCTAG: DDDDEEEECTAG.FFFFCTAG GGGGCTAGHHHH"

В приведенной выше строке, используя REGEX, я хочу найти все вхождения ' TAG 'за исключением первых 3 вхождений.

Я использовал этот REGEX,' (TAG. *?) {4} ', но он находит только 4-е вхождение (' TAG: '), но не остальные (' TAG . ',' TAG ',' TAGH ').

1 Ответ

1 голос
/ 06 апреля 2020

Если вы хотите группу захвата со всеми оставшимися совпадениями, вы должны сначала потреблять первые:

(TAG.*?){3}(TAG.*?)*

Это соответствует первым 3 вхождениям в первой группе захвата и соответствует остальным в 2nd.
Если вы не хотите, чтобы первые совпадения были в группе захвата, вы можете пометить ее как группу без захвата:

(?:TAG.*?){3}(TAG.*?)*

В зависимости от вашего примера, я думаю, что регулярное выражение внутри группа захвата еще не верна. Если это не дает вам правильной идеи о том, как это сделать, пожалуйста, дайте нам пример матчей, которые вы хотите увидеть. Тогда я отредактирую свой ответ.

РЕДАКТИРОВАТЬ:

У меня такое ощущение, что вы хотите захватить 3-й и последующие вхождения в собственных группах захвата, при этом игнорируя первые 3 вхождения.
Я не могу правильно объяснить, почему, но я думаю, что это невозможно по следующим причинам:

  • Игнорирование первых 3 вхождений в собственной (не) группе захвата вынуждает вас отказаться от модификатора 'g', чтобы найти все вхождения (потому что это просто "проигнорирует 3 TAGS, найдите 1" в al oop).
  • Невозможно захватить несколько групп только с одна группа захвата. Попытка сделать это всегда фиксирует последний случай. Существует возможность для захвата не только последнего, но и всех вхождений вместе в одной группе захвата, но кажется, что вы хотите, чтобы они были в отдельных группах.

Итак, как решить this?
Я бы придумал правильное регулярное выражение для одного тега и повторил это, используя модификатор find all или g. В python вы можете просто взять все результаты, пропуская первые 3:

import re

str = "ATAG:AAAABTAG:BBBBCTAG:CCCCCTAG:DDDDEEEECTAG.FFFFCTAG GGGGCTAGHHHH"
pattern = r"(?:TAG((?:(?!TAG).)+))"

findings = re.findall(pattern, str)[:3]

Если вы хотите игнорировать первый символ после TAG, просто добавьте . после TAG:

pattern = r"(?:TAG.((?:(?!TAG).)+))"

Объяснение регулярного выражения:
- я использую ?:, чтобы сделать некоторые группы захвата группы не захвата . Я хочу иметь дело только с одной группой захвата.
- Чтобы избавиться от не жадного модификатора и быть немного более точным, c в том, что мы на самом деле хотим, я ввел отрицательный взгляд вперед после TAG случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...