Как получить номер повторения каждой группы регулярных выражений в строке? - PullRequest
1 голос
/ 01 октября 2019

Как я могу получить количество повторений каждой группы в регулярном выражении, используя python, и получить список этих групп?

Например:
Это регулярное выражение (ab)*.*?(cd)* в строке ababababcdcddscdcdfscdcd
Должен вернуть 4 для первой группы, потому что ab существует 4 раза в строке.
И вернуть 6 для второй группы, потому что cd существует 6 раз в строке.

Эта или, может быть, другая функция должна также возвращать список групп и другую часть строки. Для этой строки это должен быть список с [ab,ab,ab,ab,cd,cd,ds,cd,cd,fs,cd,cd]. Я пытался использовать объект сопоставления, но не могу найти способ получить количество повторений в каждой группе.

Большое спасибо всем за помощь.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

В вашем паттерне вы повторяете группу захвата, которая даст вам значение последней итерации в группе. Так, например, эта часть (ab)* будет содержать значение последнего вхождения ab.

matched ()()()
        abababab
              () captured

Один из вариантов - разделить на ab или cd, используя группу захвата (ab|cd), чтобы сохранить разделитель иудалить пустые записи из результата.

Например,

import re
s = "ababababcdcddscdcdfscdcd"
pattern = r"(ab|cd)"
result = list(filter(None, re.split(pattern, s)))
print(result)

Вывод

['ab', 'ab', 'ab', 'ab', 'cd', 'cd', 'ds', 'cd', 'cd', 'fs', 'cd', 'cd']

Python demo

0 голосов
/ 01 октября 2019

Когда вы количественно определяете группу захвата, она просто захватывает первое совпадение, а не все совпадения, поэтому вы не можете получить [ab, ab, ab, ab, ...].

Вы можете поместить квантификатор в группу, чтобы всеповторы будут захвачены сразу.

((ab)*).*?((cd)*)

Группы захвата будут:

["abababab", "ab", "cdcdcdcdcdcd", "cd"]

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

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