regex,python:最后一次出现的索引。有负面的后卫

时间:2013-01-27 10:56:56

标签: python regex

我需要获取最后一次出现的正则表达式的索引。

在下面的句子中,我需要获取最后一个句点或感叹号的索引,但如果它是短缩写(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

这是“设施”之后的惊叹号。但我需要“汽车”之后的时期。

我的缩写regexp可能需要一些调整,但关键是正则表达式具有负面的后视。

我尝试使用负面预测,但它变得复杂并且不像我那样工作。

2 个答案:

答案 0 :(得分:0)

使用finditer()迭代所有匹配,然后选择最后一个(使用生成的MatchObject.start() method

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

答案 1 :(得分:0)

您可以使用以下内容查找最后一次出现.!的索引。

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()