В 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()
перед обработкой). По этой причине я приму питонские многострочные решения этого ответа.