Как сделать регулярное выражение Python, которое сопоставляет несколько шаблонов с одним и тем же индексом - PullRequest
9 голосов
/ 23 мая 2011

Можно ли получить все перекрывающиеся совпадения, которые начинаются с одного и того же индекса, но относятся к другой совпадающей группе?

например, когда я ищу шаблон "(A) | (AB)" из "ABC", регулярное выражение должно возвращать следующие совпадения:

(0, "A") и (0, "AB«)

Ответы [ 2 ]

6 голосов
/ 23 мая 2011

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

(?=(A))(?=(AB))

даст желаемый результат (т. Е. Все места, где оба шаблона совпадают с группами).

Обновление: С дополнительными пояснениями это можно сделать с помощью одного регулярного выражения. Вы просто должны сделать обе группы выше необязательными, т.е.

(?=(A))?(?=(AB))?(?:(?:A)|(?:AB))

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

string = "AABAABA"
result = [(g.start(), g.group()) for g in re.compile('A').finditer(string)]
result += [(g.start(), g.group()) for g in re.compile('AB').finditer(string)]
3 голосов
/ 23 мая 2011

Я получаю это, хотя не могу вспомнить, где или от кого

def myfindall(regex, seq):
    resultlist = []
    pos = 0
    while True:
        result = regex.search(seq, pos)
        if result is None:
            break
        resultlist.append(seq[result.start():result.end()])
        pos = result.start() + 1
    return resultlist

он возвращает список всех (даже перекрывающихся) совпадений, с пределом не более одного совпадения для каждого индекса.

...