Python正規表現-一致の位置と値を取得する方法


112

reモジュールを使用してすべての試合の開始位置と終了位置を取得するにはどうすればよいですか?たとえば、パターンr'[a-z]'と文字列が与えられ'a1b2c3d4'たら、各文字を見つける位置を取得します。理想的には、私も試合のテキストを取り戻したいです。


回答:


140
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print(m.start(), m.group())

3
このdoesntのマッチ正規表現= R '([AZ])(0-9)' m.startは、(グループのためであろう)で、他のグループの指標を提供する、しない群(1)
StevenWernerCS

@StevenWernerCS start()はグループ番号を受け入れる可能性があるため、n番目のグループのインデックスが必要な場合は、start(n)
Hi-Angel

@ hi-angel
うん、

51

から取られた

正規表現HOWTO

span()は、単一のタプルで開始インデックスと終了インデックスの両方を返します。matchメソッドは文字列の先頭でREが一致するかどうかのみをチェックするため、start()は常にゼロになります。ただし、RegexObjectインスタンスの検索メソッドは文字列をスキャンするため、その場合、一致はゼロから開始されない場合があります。

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

以下と組み合わせてください:

Python 2.2では、finditer()メソッドも使用でき、MatchObjectインスタンスのシーケンスをイテレータとして返します。

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

あなたはのオーダーで何かをすることができるはずです

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
   print match.span()

あなたは次のようにそれを使用することができますre.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
КонстантинВан

によって返される「終了インデックス」はspan()、Pythonのスライス表記の「停止」に似ていますが、そのインデックスは含まれていません。こちらをご覧ください
ウェイン

20

Python 3.xの場合

from re import finditer
for match in finditer("pattern", "string"):
    print(match.span(), match.group())

\n文字列内のヒットごとに、分離されたタプル(一致の最初と最後のインデックスをそれぞれ含む)と一致自体を取得します。


2

スパンとグループは、正規表現のマルチキャプチャグループに対してインデックス化されることに注意してください

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
    for idx in range(0, 4):
        print(match.span(idx), match.group(idx))

1
おかげで、これは非常に便利で、非常に埋もれているようです。また、誰かがこれを必要とする場合:名前付きキャプチャグループを使用する場合、<match> .re.groupindexを使用してグループのインデックスを見つけ、そこから、概説したアプローチを使用して対応するスパンを見つけることができます
madimov

どこ4から来たの?
ラジコン

@RadioControlled number_of_known_groups_in_the_regex + 1、範囲は[start、end)endを
除く

@StevenWernerCSなので、グループの数が不明な場合に一般化されません...
無線制御
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.