Мне нужно получить индекс последнего вхождения регулярного выражения.

В приведенном ниже предложении мне нужно получить индекс последнего периода или восклицательный знак, но не в том случае, если это часть короткого сокращения (space-char-period)

Great buy w. all amenities! Use on all cars. come on in 

Я могу получить индекс первого появления, как это

t = u"Great buy w. all amenities! Use on all cars. come on in "
p = "(?<! .)([.] |! )"
i = len(re.compile(p).split(t)[0])
print i

Это восклицательный знак после «удобства». Но мне нужен период после "авто".

Моему сокращенному регулярному выражению может потребоваться некоторая настройка, но дело в том, что регулярное выражение имеет отрицательный взгляд.

Я пытался использовать негативный прогноз, но это усложнилось и не сработало так, как я это сделал.

0
user984003 27 Янв 2013 в 14:56

2 ответа

Лучший ответ

Выполните итерацию всех совпадений, используя finditer(), и выберите последний (используя полученный MatchObject .start() метод:

import re

p = re.compile("(?<! .)([.] |! )")
t = u"Great buy w. all amenities! Use on all cars. come on in "

last = None
for m in p.finditer(t):
    last = m

if last is not None:
    print m.start()

Печатает 43.

Обратите внимание, что ваше регулярное выражение в его нынешнем виде не будет работать с любой пунктуацией, которая является символом last в вашем вводе; если t был изменен на:

t = u"Great buy w. all amenities! Use on all cars. come on in!"

Результат по-прежнему будет 43, а не 55. Вам нужно будет сопоставить знаки препинания с последующим пробелом или в конце строки:

p = re.compile("(?<! .)([.!](?:\s|$))")

Тогда это дает:

>>> import re
>>> t = u"Great buy w. all amenities! Use on all cars. come on in!"
>>> p = re.compile("(?<! .)([.!](?:\s|$))")
>>> last = None
>>> for m in p.finditer(t):
...     last = m
... 
>>> if last is not None:
...     print m.start()
... 
55
0
Martijn Pieters 27 Янв 2013 в 11:34

Вы можете использовать следующее, чтобы найти индекс последнего вхождения . или !.

t = u"Great buy w. all amenities! Use on all cars. come on in "
i = re.search(r"((?<!\s\S)\.|!)[^.!]*$", t)
if i is not None:
    print i.start()
0
MikeM 27 Янв 2013 в 11:20