파이썬(Python) 개발자들이 종종 혼란을 겪는 부분 중 하나는 문자열 리터럴, 특히 원시(raw) 문자열(r-string)과 f-스트링(f-string)의 예상치 못한 구문 규칙입니다. 겉보기에는 직관적일 것 같지만, 특정 상황에서는 문법 오류를 일으키거나 의도와 다른 결과를 반환할 수 있어 주의가 필요합니다. 이는 파이썬 언어의 내부적인 어휘 분석(lexical analysis) 및 파싱(parsing) 방식과 깊이 연관되어 있습니다.
가장 대표적인 예는 원시 문자열 끝에 홀수 개의 백슬래시(backslash)를 사용할 수 없다는 규칙입니다. 예를 들어, `r'asdf\'`는 문법 오류를 발생시키지만, `r'asdf\\'`는 유효하며 문자열 내용은 `asdf\`가 됩니다. 이는 `r` 접두사가 백슬래시 이스케이프(escape) 시퀀스의 해석만 막을 뿐, 문자열을 닫는 따옴표를 구분하는 어휘 분석 규칙까지 바꾸지는 않기 때문입니다. 즉, 백슬래시 바로 뒤에 오는 따옴표는 문자열 종료 문자로 취급되지 않는다는 원시 문자열의 특성 때문에, 문자열을 제대로 닫으려면 짝수 개의 백슬래시가 필요합니다. 이러한 규칙은 파이썬 초기 구현을 단순화하기 위해 도입된 것으로 알려져 있습니다.
한편, f-스트링은 중괄호 `{}` 안에 따옴표, 여러 줄, 심지어 주석까지 포함하는 복잡한 표현식을 허용합니다. 예를 들어, `f'{'}'}'`와 같은 형태도 유효한 f-스트링입니다. 이는 f-스트링 표현식 내부를 해석하기 위해 파이썬 전체 파서(parser)가 필요함을 의미합니다. 표현식은 괄호 밖의 `}`, `!`, `:`와 같은 구분자에서 종료되므로, 람다(lambda)나 할당 표현식(assignment expression, 바다코끼리 연산자 `:=`)을 사용할 때는 괄호로 감싸야 합니다. 이러한 유연성은 개발자에게 강력한 기능을 제공하지만, 동시에 구문 분석의 복잡성을 증가시키고 예상치 못한 동작을 유발할 수 있습니다. 과거에는 f-스트링 내부의 문자열 리터럴이 먼저 분석된 뒤 다시 `_`를 기준으로 재분석되는 방식이었으나, PEP 701을 통해 개선되어 현재와 같은 복잡한 표현식도 처리할 수 있게 되었습니다.
이러한 파이썬 문자열 리터럴의 미묘한 구문 규칙들은 언어 설계자들이 기능적 유연성과 구현의 단순성 사이에서 어떤 절충을 했는지를 보여줍니다. 개발자 입장에서는 이러한 특이점을 이해하고 있어야 예상치 못한 오류를 피하고 더욱 견고한 코드를 작성할 수 있습니다. 특히, 다른 언어에서도 문자열 보간(interpolation)이나 원시 문자열 처리에서 비슷한 복잡성이 나타나는 경우가 많으므로, 언어별 특성을 파악하는 것이 중요합니다.