Python의 str.splitlines()가 유니버설 개행을 포함해 다양한 유니코드 줄 경계에서 분리하는 동작을 설명하고 예제로 보여준다.
(이 주제로 파고들게 해 준 Seth Larson께 감사드립니다.)
나는 늘 Python의 str.splitlines()가 "유니버설 개행(universal newlines)", 즉 \n, \r, 그리고 \r\n을 기준으로 문자열을 분할한다고 생각해 왔다.
하지만 실제로는 그보다 훨씬 더 많은 것을 처리한다. 문서에 따르면:
이 메서드는 다음과 같은 줄 경계에서 분리합니다. 특히, 이러한 경계는 유니버설 개행(universal newlines)의 상위 집합입니다.
표기 설명 \n라인 피드 \r캐리지 리턴 \r\n캐리지 리턴 + 라인 피드 \v또는\x0b수직 탭(라인 탭) \f또는\x0c폼 피드 \x1c파일 구분자 \x1d그룹 구분자 \x1e레코드 구분자 \x85다음 줄(Next Line, C1 제어 코드) \u2028줄 구분자 \u2029문단 구분자
이로 인해 (내게는) 다소 놀라운 분할 동작이 나타난다:
>>> s = "line1\nline2\rline3\r\nline4\vline5\x1dhello"
>>> s.splitlines()
['line1', 'line2', 'line3', 'line4', 'line5', 'hello']
반면 내가 예상했던 결과는 다음과 같았다:
["line1", "line2", "line3", "line4\vline5\x1dhello"]
이는 유니코드가 반드시 "인쇄 가능"을 의미하지 않는다는 점, 그리고 C0 및 C1 제어 코드에 의미를 부여하는 생태계가 여전히 많다는 점을 주기적으로 상기시켜 준다.