9

re.findall を使用して、クエリの開始位置と終了位置を順番に取得しようとしています。

import re

sequence = 'aaabbbaaacccdddeeefff'

query = 'aaa'

findall = re.findall(query,sequence)

>>> ['aaa','aaa']

findall.start() や findall.end() のようなものを取得するにはどうすればよいですか?

私は取得したいです

start = [0,6]
end = [2,8]

そんなこと知ってる

search = re.search(query,sequence)

print search.start(),search.end()

>>> 0,2

私に最初のインスタンスだけを与えるだろう

4

3 に答える 3

21

使用re.finditer:

>>> import re
>>> sequence = 'aaabbbaaacccdddeeefff'
>>> query = 'aaa'
>>> r = re.compile(query)
>>> [[m.start(),m.end()] for m in r.finditer(sequence)]
[[0, 3], [6, 9]]

ドキュメントから:

文字列内の RE パターンの重複しないすべての一致に対してiterator生成インスタンスを返します。MatchObject文字列は左から右にスキャンされ、見つかった順序で一致が返されます。

于 2013-07-11T22:20:49.523 に答える
3

できません。ドキュメントが言うように、「文字列のリスト」を返すfindall便利な関数です。のリストが必要な場合は、使用できません。MatchObjectfindall

ただし、使用できますfinditer。Matches を反復処理するだけの場合は、同じ方法for match in re.findall(…):を使用できますが、文字列の代わりに値を取得します。実際にリストが必要な場合は、 を使用してください。for match in re.finditer(…)MatchObjectmatches = list(re.finditer(…))

于 2013-07-11T22:21:58.193 に答える
1

findall の代わりに finditer を使用します。これにより、MatchObject インスタンスを生成する反復子が返され、MatchObject から開始/終了を取得できます。

于 2013-07-11T22:21:53.390 に答える