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


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
이것은 일치하는 다른 그룹의 색인을 제공하지 않습니다. regex = r '([az]) (0-9)'m.start는 group (1)이 아닌 group ()을위한 것입니다
StevenWernerCS

@StevenWernerCS start()는 그룹 번호를 허용 할 수 있으므로 n 번째 그룹의 인덱스를 원하면start(n)
Hi-Angel

@ hi-angel yep, 작년부터 내 대답을 참조하십시오
StevenWernerCS

51

에서 가져옴

정규식 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()

당신처럼 사용할 수 있습니다 re.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
Константин Ван

에서 반환 된 '종료 인덱스' span()는 위로 올라가지 만 해당 인덱스를 포함하지 않는다는 점에서 파이썬 슬라이스 표기법의 '중지'와 같습니다. 여기를 참조 하십시오 .
Wayne

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, 범위는 끝을
제외한

@StevenWernerCS는 그룹 수를 알 수없는 경우에 일반화하지 않습니다.
Radio Controlled
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.