0

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

在下面的句子中,我需要获取最后一个句点或感叹号的索引,但如果它是简短缩写(空格字符句点)的一部分,则不需要

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 可能需要一些调整,但关键是 regexp 有负面的后视。

我尝试使用负前瞻,但它变得复杂并且没有按照我的方式工作。

4

2 回答 2

0

使用 遍历所有匹配项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

请注意,就目前而言,您的正则表达式不适用于输入中最后一个字符的任何标点符号;如果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
于 2013-01-27T11:04:08.243 回答
0

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

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()
于 2013-01-27T11:10:47.860 回答