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

Пример строки в файле: «CIS 14A Visual Basic .NET Programming I x x x x»

Я пытаюсь сгруппировать строки в файле в три группы: group (0) должен быть номером курса (14A), group (1) должен быть темой (Visual Basic .NET Programming I), и group ( 2) должны быть кварталы, в которых доступен курс. Однако, когда я тестировал код, группа (0) соответствовала всей строке, группа (1) была курсом №, группа (2) была пустой ... и группа (3) была комбинация темы и доступных кварталов. Я не могу найти, что с ним не так, потому что каждый набор скобок создает группу, но все группы расположены в неправильном порядке, и «CIS», который я не включил ни в одну скобку, был включен в группу (0) по какой-то причине. Я новичок в regex, поэтому любые советы о том, как исправить мой код, будут высоко оценены.

    with open(filename) as infile:
        for line in infile:
            self._match = (re.search('^CIS\s(\d*\w*)(\w*)\s?[^x]*(.*)$', line, re.I))
            self._numb = self._match.group(0).strip()
            self._name = self._match.group(1).strip()
            self._quarter=self._match.group(2).strip().split('x')

1 Ответ

2 голосов
/ 18 июня 2019

Обратите внимание, что всегда .group() с столько, сколько существует групп захвата + 1, поскольку нулевая группа зарезервирована для всего совпадения.

Регулярное выражение, которое вы можете использовать:

^CIS\s+([0-9A-Z]+)\s(.*?)\s(x\s.*)

См. Демоверсию regex

См. Фрагмент Python:

with open(filename, 'r') as infile:
    for line in infile:
        self._match = re.search(r'^CIS\s+([0-9A-Z]+)\s(.*?)\s(x\s.*)', line, re.I)
        if self._match:
            self._numb = self._match.group(1).strip()
            self._name = self._match.group(2).strip()
            self._quarter=self._match.group(3).strip().split('x')

Сведения о регулярном выражении

  • ^ - начало строки
  • CIS - буквальная подстрока
  • \s+ - 1+ пробелов
  • ([0-9A-Z]+) - Группа 1: одна или несколько цифр или заглавных букв
  • \s - пробел
  • (.*?) - Группа 2: любые 0 или более символов, кроме символов разрыва строки, как можно меньше
  • \s - пробел
  • (x\s.*) - Группа 3: x, пробел и любые 0 или более символов, кроме символов разрыва строки, как можно больше.

Также проверьте график регулярных выражений :

enter image description here

enter image description here

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