re
모듈을 사용하여 모든 경기의 시작 및 끝 위치를 어떻게 얻을 수 있습니까? 예를 들어 패턴 r'[a-z]'
과 문자열이 주어지면 'a1b2c3d4'
각 문자를 찾는 위치를 얻고 싶습니다. 이상적으로는 경기의 텍스트도 다시 받고 싶습니다.
답변
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
print(m.start(), m.group())
답변
에서 가져옴
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))