문제 상황
문자열을 여러 필드로 나누어야 하는데, 구분자가 문자열 전체에서 일관되지 않은 경우가 있습니다. 예를 들어 하이픈(-), 쉼표(,), 공백 등 다양한 구분자가 섞여 있는 문자열을 처리할 때 단순한 split() 메서드만으로는 해결하기 어렵습니다.
해결 방법
파이썬에서 여러 구분자를 기준으로 문자열을 분할하는 방법은 여러 가지가 있습니다. 가장 간단한 접근 방식은 split() 메서드를 사용하는 것이지만, 이 메서드는 단순한 경우만 처리하도록 설계되어 있습니다.
re.split()은 복잡한 문자열 패턴을 다룰 때 일반 split() 메서드보다 훨씬 유연하게 대응할 수 있습니다.
re.split()을 사용하면 정규 표현식을 통해 여러 개의 구분자 패턴을 동시에 지정할 수 있습니다. 예를 들어 구분자가 하이픈(-), 공백( ), 또는 쉼표(,)인 경우 모두 하나의 패턴으로 처리할 수 있습니다. 정규 표현식 공식 문서는 파이썬 공식 사이트에서 확인할 수 있습니다.
패턴과 일치하는 부분을 발견하면, 해당 매치 전체가 양옆 필드 사이의 구분자 역할을 하게 됩니다.
시나리오 1: 구분자를 제외하고 텍스트만 추출하기
구분자 자체는 결과에서 제거하고, 구분자 사이의 값들만 리스트로 얻고 싶다면 문자 클래스 [] 안에 구분자들을 지정하면 됩니다.
예제 코드
import re tennis_greats = 'Roger-federer, Rafael nadal, Novak Djokovic,Andy murray' """ #----------------------------------------------------------------------------- # 시나리오 1 - 선수 이름만 출력 # 입력 - 여러 구분자(- , 공백)가 포함된 문자열 # 코드 - [] 안에 구분자들을 지정 #----------------------------------------------------------------------------- """ players = re.split(r'[-,\s]\s*', tennis_greats)
실행 결과
print(f" The output is - {players}")
출력 결과는 다음과 같습니다.
['Roger', 'federer', 'Rafael', 'nadal', 'Novak', 'Djokovic', 'Andy', 'murray']
위 결과를 보면 하이픈, 쉼표, 공백 모두 제거되고 선수 이름만 깔끔하게 분리된 것을 확인할 수 있습니다.
시나리오 2: 구분자를 포함하여 텍스트 추출하기
반대로 분할된 텍스트와 함께 어떤 구분자가 사용되었는지도 확인하고 싶다면, 캡처 그룹을 활용해 구분자들을 파이프(|)로 연결하여 지정하면 됩니다.
예제 코드
import re tennis_greats = 'Roger-federer, Rafael nadal, Novak Djokovic,Andy murray' """ #----------------------------------------------------------------------------- # 시나리오 2 - 선수 이름과 구분자를 함께 출력 # 입력 - 여러 구분자(- , 공백)가 포함된 문자열 # 코드 - 구분자들을 파이프(|) 사이에 지정 #----------------------------------------------------------------------------- """ players = re.split(r'(-|,|\s)\s*', tennis_greats)
실행 결과
print(f" The output is -{players}")
출력 결과는 다음과 같습니다.
['Roger', '-', 'federer', ',', 'Rafael', ' ', 'nadal', ',', 'Novak', ' ', 'Djokovic', ',', 'Andy', ' ', 'murray']
이처럼 정규 표현식을 괄호 ()로 감싸 캡처 그룹으로 만들면, 분할된 결과 목록에 구분자까지 함께 포함됩니다. 데이터 전처리 과정에서 어떤 구분자가 어디에 사용되었는지 추적해야 할 때 특히 유용합니다.