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

それは「アメニティ」の後の感嘆符です。しかし、「車」の後にピリオドが必要です。

私の省略形の正規表現には多少の調整が必要かもしれませんが、要点は、正規表現には否定的な後読みがあるということです。

否定的な先読みを使用しようとしましたが、複雑になり、私のやり方ではうまくいきませんでした。

4

2 に答える 2

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