문자열을 처리할 때 regex는 생각보다 많이 쓰게 됩니다. 파이썬에서는 re를 제공하고 있는데요. match와 fullmatch에 대해서 간단하게 알아보겠습니다.

 


 먼저 match를 보도록 하겠습니다. match는 target이 해당 패턴으로 시작하는지를 검사해서, 그렇다면 Match object를 돌려줍니다. 예를 들자면, 패턴 'a'로 시작하는 문자열 'abc'는 참입니다. 그런데 패턴 'b'로 시작하는 문자열 'abc'는 거짓입니다. 

 

 따라서, 위 프로그램의 결과는 1번째는 Match 되는 오브젝트가 떨어질 것이고, 2번째는 None이 나올 겁니다.

 

 정말 그런가요? 네. 그래서, 어떠한 문자가 특정한 패턴으로 시작하는지 판단하려면 re의 match를 이용하면 됩니다.

 


 fullmatch는 문자열 전체가 해당 패턴인지를 검사합니다.

 

 

 fullmatch 또한 1번째 인자로 넘어가는 건 pattern, 2번째 인자로 넘어가는 것은 문자열인데요. 'abc' 문자열 전체는 'abc' 패턴입니다. 그러므로, 이건 match가 될 겁니다. 그런데, 'abc'가 패턴 'a'와 정확히 일치하지는 않아요. 그러므로, 1번째 결과는 Match 오브젝트가 떨어지고, 2번째 결과는 None이 나옵니다.

 

 

 쉽게 말해서, 패턴과 일치하는 접두사가 있는지를 판단하려면 match를, 문자열 전체가 패턴과 일치하느냐를 검사하려면 fullmatch를 쓰시면 됩니다.

 

 

 둘의 차이를 잘 보여주는 예제를 하나 가지고 왔어요. 'abc'에서 패턴이 'a'인 접두어가 있어요. 따라서 1번째 print 문에서는 match가 된 object가 떨어집니다. 그런데, s 자체가 패턴 'a'는 아닙니다. 따라서, 2번째 결과는 None이 나옵니다.

 

 

 결과는 의도한 대로 잘 나온 듯 싶습니다.

 


 만약에, 어떤 문자열이 숫자 3개 이상이 연속된 패턴으로 끝나는지를 검사하려면 어떻게 하면 될까요? 사실 이런 문제가 주어진 경우, 저는 뒤에서부터 for loop를 돌리면서 숫자가 아닌 게 처음 나왔을 때 break를 걸 듯 합니다. 그게 경험상 regex보다는 빠르기 때문입니다. 굳이 match나 fullmatch를 써야 한다면, 아래와 같이 쓸 듯 합니다.

 

 

 딱히 어려운 것은 없습니다. .는 any character를 의미합니다. 그리고 *는 0개 이상 반복됨을 의미합니다. 즉, 앞에 붙은 .*는 0개 이상 반복된 어떠한 문자들의 패턴을 의미합니다. 사실상 빈 문자열이여도 되는셈입니다. 다음에 [0-9]{3,}이 붙었는데요. 이는 숫자 패턴이 셋 이상 나타남을 의미합니다.

 

 결국, 저 정규식은 빈 문자열이나 길이가 1 이상인 문자열이 온 다음에 숫자 3개 이상이 연속한 패턴이 오는 패턴인데요. 문자열 전체가 저것과 매치되느냐를 검사할 겁니다. 1번째는 match가 되겠죠? 2번째는 맨 뒤에 'a'가 있으므로 탈락입니다. 3번째는 뒷자리 3개가 모두 숫자이므로 가능합니다.

 

 

 결과는 요래 나옴을 알 수 있습니다.