Я пытаюсь захватить подстроки из строки, которая похожа на
'some string, another string, '
Я хочу, чтобы группа соответствия результатов была
('some string', 'another string')
мое текущее решение
>>> from re import match
>>> match(2 * '(.*?), ', 'some string, another string, ').groups()
('some string', 'another string')
работает, но практически неосуществимо - то, что я показываю здесь, конечно, значительно сокращено с точки зрения сложности по сравнению с тем, что я делаю в реальном проекте; Я хочу использовать только один «прямой» (не вычисленный) шаблон регулярного выражения. К сожалению, мои попытки пока не увенчались успехом:
Это не соответствует (нет как результат), потому что {2} применяется только к пробелу, а не ко всей строке:
>>> match('.*?, {2}', 'some string, another string, ')
добавление скобок вокруг повторяющейся строки приводит к запятой и пробелу в результате
>>> match('(.*?, ){2}', 'some string, another string, ').groups()
('another string, ',)
добавление еще одного набора паратезов исправляет это, но слишком много для меня:
>>> match('((.*?), ){2}', 'some string, another string, ').groups()
('another string, ', 'another string')
Добавление модификатора без захвата улучшает результат, но по-прежнему пропускает первую строку
>>> match('(?:(.*?), ){2}', 'some string, another string, ').groups()
('another string',)
Я чувствую, что я рядом, но я не могу найти правильный путь.
Кто-нибудь может мне помочь? Других подходов я не вижу?
Обновление после первых нескольких ответов:
Прежде всего, большое спасибо всем, ваша помощь очень ценится! : -)
Как я сказал в оригинальном посте, я опустил много вопросов в моем вопросе, чтобы изобразить реальную основную проблему. Для начала, в проекте, над которым я работаю, я анализирую большое количество файлов (в настоящее время десятки тысяч в день) в ряде (в настоящее время 5, скоро ~ 25, возможно, сотнями позже) различных форматов на основе строк. Существуют также XML, JSON, двоичные и некоторые другие форматы файлов данных, но давайте сосредоточимся.
Чтобы справиться с множеством форматов файлов и использовать тот факт, что многие из них основаны на строках, я создал несколько универсальный модуль Python, который загружает один файл за другим, применяет регулярное выражение к каждой строке и возвращает большую структуру данных с совпадениями. Этот модуль является прототипом, рабочая версия потребует версию C ++ по соображениям производительности, которая будет подключена через Boost :: Python и, возможно, добавит тему диалектов регулярных выражений в список сложностей.
Кроме того, существует не 2 повторения, а количество, варьирующееся в настоящее время от нуля до 70 (или около того), запятая не всегда является запятой, и, несмотря на то, что я сказал изначально, некоторые части шаблона регулярного выражения придется вычислять во время выполнения; скажем так, у меня есть причина попытаться уменьшить «динамическое» количество и иметь как можно больше «фиксированных» паттернов.
Итак, одним словом: Я должен использовать регулярные выражения.
Попытка перефразировать: Я думаю, что суть проблемы сводится к следующему: существует ли нотация Python RegEx, например, включает повторения фигурных скобок и позволяет мне захватить
'some string, another string, '
в * * тысяча пятьдесят-одна
('some string', 'another string')
Хммм, это, вероятно, сужает это слишком далеко - но тогда, в любом случае, это неправильно: -D
Вторая попытка перефразировать: Почему я не вижу первую строку («некоторую строку») в результате? Почему регулярное выражение выдает совпадение (указывая, что должно быть 2 чего-то), но возвращает только 1 строку (вторую)?
Проблема остается той же, даже если я использую нечисловое повторение, т.е. используя + вместо {2}:
>>> match('(?:(.*?), )+', 'some string, another string, ').groups()
('another string',)
Кроме того, возвращается не вторая строка, а последняя:
>>> match('(?:(.*?), )+', 'some string, another string, third string, ').groups()
('third string',)
Опять же, спасибо за вашу помощь, не перестаю удивлять меня, насколько полезна рецензирование, когда пытаюсь выяснить, что я на самом деле хочу знать ...