Сопоставление двух взаимоисключающих групп в одном поиске регулярного выражения Python - PullRequest
0 голосов
/ 25 марта 2019

Я ищу цифру, которая может появляться в двух разных рисунках. Шаблоны являются взаимоисключающими внутри одной строки, и поскольку они имеют одинаковое значение, я хочу объединить результат в одну переменную.

abc: DIGIT или DIGIT-xyz

Создание шаблонов само по себе не проблема, но я не уверен, как правильно вернуть сопоставленную группу (цифру).

text = 'lorem ipsum abc: 3 lorem ipsum'

my_pattern = re.compile("(abc:\s+(\d)|(\d)-xyz)")
result = re.search(my_pattern, text)

if result:
    if result.group(2):
        return result.group(2)
    else:
        return result.group(3)

# returns 3

Это решение отлично работает, но что, если будет более двух альтернатив? Есть ли более элегантный способ вместо написания нескольких условных операторов?

1 Ответ

0 голосов
/ 25 марта 2019

Поскольку вы знаете, что будет заполнена только одна группа, вы можете отфильтровать все значения None из result.groups() и получить первый элемент.Просто используйте группы захвата только вокруг частей, которые нужно извлечь, а не вокруг всего шаблона:

import re
text = 'lorem ipsum abc: 3 lorem ipsum'
my_pattern = re.compile(r"abc:\s+(\d)|(\d)-xyz")
result = my_pattern.search(text)

if result:
    print(list(filter(None, result.groups()))[0])

См. Python demo .

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