我需要获取最后一次出现的正则表达式的索引。
在下面的句子中,我需要获取最后一个句点或感叹号的索引,但如果它是短缩写(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可能需要一些调整,但关键是正则表达式具有负面的后视。
我尝试使用负面预测,但它变得复杂并且不像我那样工作。
答案 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()