전체 페이지뷰

2016년 12월 2일 금요일

Regular expression with Python, MatchObject

MatchObject



match, search, finditer의 방법을 통해 얻어진 결과물을 MatchObject라고 합니다.
지금부터 이 object를 다루는 법을 살펴 보겠습니다.








group([group1, …])

group 메소드는 매치된 결과물의 하위그룹을 제공해 줍니다.

>>> import re
>>> pattern = re.compile(r"(\w+)⇢(\w+)")
>>> match = pattern.search("Hello⇢world")

모든 영숫자(\w)가 하나 이상(+) 나오고 공백이 이어진 후 또 반복되는 패턴입니다.
그리하여 영숫자 부분을 ()를 사용하여 그룹으로 묶어줍니다. 
이것을 "Hello world"에 적용하면 "Hello world"라는 글 전체에 해당됩니다.

group 인자에 아무것도 넣지 않거나 0을 주면 문장 전체를 반환합니다.

>>> match.group()
'Hello world'
>>> match.group(0)
'Hello world'

1 이상의 숫자에는 각각의 그룹을 반환합니다.
>>> match.group(1)
'Hello'
>>> match.group(2)
'world'

그룹이 존재하지 않으면 IndexError가 발생합니다.
>>> match.group(3)
Traceba...
IndexError: no such group

복수의 인자를 주면 각각에 해당하는 그룹을 반환합니다.
>>> match.group(0,2)
('Hello world', 'world')

지금까지는 그냥 디폴트로 숫자를 사용했지만, 
?P<그룹명> 구문을 이용하여 그룹에 이름을 지을 수도 있습니다

>>> pattern = re.compile(r"(?P<first>\w+)(?P<second>\w+)")
>>> match = pattern.search("Hello⇢world")

첫번째 그룹은 first, 두번째 그룹은 'second'라고 이름 지었습니다.
(여전히 숫자도 사용 가능합니다)

>>> match.group('first')
'Hello'
>>> match.group(1)
'Hello'

복합해서 사용도 가능합니다.

>>> match.group(0,1,'second')
('Hello world', 'Hello', 'world')

groups([default])


group 메소드와 동일하나 모든 서브그룹들로 이루어진 튜플을 반환합니다.

>>> match.groups()
('Hello', 'world')

매칭되는 결과가 없을 때 default 인자가 쓰입니다.

>>> pattern = re.compile("(\w+)(\w+)?")
>>> match = pattern.search("Hello")
전의 패턴과 다른 것은 마지막에 쓰인 ?입니다. 그래서 뒷 그룹은 있어도 없어도 상관없게 해줍니다.


>>> match.groups()
('Hello', None)
>>> match.groups("mundo")
('Hello', 'mundo')

해당 그룹이 없을 때는 'None' 또는 default 인자로 지정된 'mundo'가 반환되었습니다.

groupdict([default])

groupdict 메소드는 그룹에 이름을 지었을때 그룹명:match 로 이루어진 dictionary를 반환합니다.(이름을 지정하지 않으면 빈 딕셔너리를 반환합니다)

>>> pattern = re.compile(r"(?P<first>\w+) (?P<second>\w+)")
>>> pattern.search("Hello⇢world").groupdict()
{'first': 'Hello', 'second': 'world'}

start([group])

때로 패턴 매칭이 시작되는 인덱스를 알 필요가 있습니다. 그 때 start를 사용합니다.

>>> pattern = re.compile(r"(?P<first>\w+) (?P<second>\w+)")
>>> match = pattern.search("Hello⇢")

인자는 그룹의 번호입니다(없으면 전체 문자열의 시작을 반환합니다).
>>> match.start(1)
0
매치되는 것이 없으면 -1을 반환합니다.
>>> match.start(2)
-1

end([group])

start와 용법이 같습니다. 끝나는 인덱스를 반환해 줍니다.
>>> match.end(1)
5

span([group])

매칭되는 그룹의 인덱스를 (start,end)의 튜플로 반환해줍니다.
>>> match.span(1)
(0, 5)

expand(template)

매칭된 object를 template로 바꿔서 반환해줍니다. sub의 기능과 비슷하다고 할 수 있습니다.
>>> text = "imagine a new *world*, a magic *world*"
>>> match = re.search(r'\*(.*?)\*', text)
>>> match.expand(r"<b>\g<1><\\b>")
'<b>world<\\b>'

여기까지 MatchObject를 다루는  메소드들에 대해 알아 보았습니다.



댓글 없음:

댓글 쓰기