В Python я пытаюсь найти последнюю позицию в произвольной строке, которая соответствует заданному шаблону, который указан как шаблон регулярного выражения отрицательного набора символов. Например, со строкой uiae1iuae200 и шаблоном, который не является числом (шаблон регулярного выражения в Python для этого будет [^0-9]), мне понадобится '8' (последний 'e' перед '200') ) в результате.
Какой самый питонный способ добиться этого?
Так как немного сложно быстро найти документацию по методу и наиболее подходящий метод для чего-либо в документации по Python (поскольку документы по методам находятся где-то посередине соответствующей страницы, например, re.search() на странице re), лучшим я быстро обнаружил, что использую re.search() - но текущая форма просто должна быть неоптимальным способом сделать это:
import re
string = 'uiae1iuae200' # the string to investigate
len(string) - re.search(r'[^0-9]', string[::-1]).start()
Я не удовлетворен этим по двум причинам: - а) мне нужно перевернуть string перед использованием ее с [::-1], и - б) мне также нужно перевернуть результирующую позицию (вычитая ее из len(string) из-за того, что перевернул строку раньше.
re.search() быть лучшие способы для этого, вероятно, даже с результатом re.search().
Мне известно о re.search(...).end() поверх .start(), но re.search() кажется, разбивает результаты на группы, для которых я не быстро нашел не слишком громоздкий способ применения это до последней подобранной группы. Без указания группы .start(), .end() и т.д., Кажется, всегда соответствуют первой группе, которая не имеет информации о положении о последнем совпадении. Однако выбор группы, по-видимому, сначала требует, чтобы возвращаемое значение было временно сохранено в переменной (что предотвращает аккуратные однострочные), так как мне нужно было бы получить доступ как к информации о выборе последней группы, так и к выбору .end() из этой группы.
Какое ваше питоническое решение для этого? Я бы оценил быть питонным больше, чем иметь наиболее оптимизированное время выполнения.
Обновить
Решение должно быть функциональным и в угловых случаях, таких как 123 (нет позиции, соответствующей регулярному выражению), пустая строка и т.д. Оно не должно падать, например, из-за выбора последнего индекса пустого списка. Тем не менее, поскольку даже моему уродливому ответу на этот вопрос в приведенном выше вопросе потребуется более одной строки для этого, я предполагаю, что однострочный может быть невозможным для этого (просто потому, что нужно проверить возвращаемое значение re.search() или re.finditer() перед обработкой). По этой причине я приму питонские многострочные решения этого ответа.