[python] Python Regex-일치 항목의 위치와 값을 얻는 방법

re모듈을 사용하여 모든 경기의 시작 및 끝 위치를 어떻게 얻을 수 있습니까? 예를 들어 패턴 r'[a-z]'과 문자열이 주어지면 'a1b2c3d4'각 문자를 찾는 위치를 얻고 싶습니다. 이상적으로는 경기의 텍스트도 다시 받고 싶습니다.



답변

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


답변

에서 가져옴

정규식 HOWTO

span ()은 단일 튜플에서 시작 및 끝 인덱스를 모두 반환합니다. match 메서드는 RE가 문자열의 시작 부분에서 일치하는지 확인하기 때문에 start ()는 항상 0입니다. 그러나 RegexObject 인스턴스의 검색 방법은 문자열을 스캔하므로이 경우 일치 항목이 0에서 시작하지 않을 수 있습니다.

>>> 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()


답변

Python 3.x의 경우

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

당신은 얻을 것이다 \n문자열의 각 히트에 대해, 분리 된 튜플 (각각 첫번째 포함하고, 경기의 마지막 인덱스)와 경기 자체를.


답변

범위 및 그룹은 정규식의 다중 캡처 그룹에 대해 인덱싱됩니다.

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))


답변