Вы можете использовать re.finditer
, чтобы извлечь начальные позиции всех матчей и вернуть последнюю из списка. Попробуйте этот код Python:
import re
print([m.start(0) for m in re.finditer(r'\D', 'uiae1iuae200')][-1])
Печать:
8
Edit:
Для того, чтобы сделать решение немного более элегантным для правильного поведения для всех видов входных данных, вот обновленный код. Теперь решение идет в две строки, так как проверка должна быть выполнена, если список пуст, тогда он напечатает -1, иначе значение индекса:
import re
arr = ['', '123', 'uiae1iuae200', 'uiae1iuae200aaaaaaaa']
for s in arr:
lst = [m.start() for m in re.finditer(r'\D', s)]
print(s, '-->', lst[-1] if len(lst) > 0 else None)
Печатает следующее, где, если такой индекс не найден, печатается None
вместо индекса:
--> None
123 --> None
uiae1iuae200 --> 8
uiae1iuae200aaaaaaaa --> 19
Редактировать 2:
Как заявил OP в своем посте, \d
был только примером, с которого мы начали, благодаря которому я нашел решение для работы с любым общим регулярным выражением. Но, если эта проблема действительно должна быть решена только с \d
, то я могу дать лучшее решение, которое вообще не требовало бы понимания списков и могло быть легко написано с использованием лучшего регулярного выражения, чтобы найти последнее вхождение нецифрового числа. характер и распечатать его положение. Мы можем использовать .*(\D)
regex, чтобы найти последнее вхождение нецифрового и легко напечатать его индекс, используя следующий код Python:
import re
arr = ['', '123', 'uiae1iuae200', 'uiae1iuae200aaaaaaaa']
for s in arr:
m = re.match(r'.*(\D)', s)
print(s, '-->', m.start(1) if m else None)
Печатает строку и соответствующий ей индекс нецифрового символа и None
, если не найдено:
--> None
123 --> None
uiae1iuae200 --> 8
uiae1iuae200aaaaaaaa --> 19
И, как вы можете видеть, этот код не должен использовать какое-либо понимание списка, и он лучше, так как он может просто найти индекс только одним вызовом регулярного выражения match
.
Но если OP действительно подразумевал, что он должен быть написан с использованием любого общего шаблона регулярных выражений, то мой приведенный выше код, использующий понимание. Я даже могу написать его как функцию, которая может принимать регулярное выражение (например, \d
или даже сложное) в качестве аргумента и динамически генерировать отрицание переданного регулярного выражения и использовать его в коде. Дайте мне знать, если это действительно необходимо.