파이썬에서 공백 기준 문자열 분할 (따옴표 포함 문자열 유지)
공백을 기준으로 문자열을 분할하면서, 따옴표로 묶인 부분 문자열은 하나의 요소로 유지하는 방법을 알아봅니다. 예를 들어, 다음과 같은 문자열이 있다고 가정해봅시다.
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
이 문자열을 공백 기준으로 분할하면 다음과 같은 결과가 됩니다.
['안녕하세요', "'세상은'", '아름답습니다.', 'Python은', "'매우'", '유용합니다.']
하지만 원하는 결과는 다음과 같습니다.
['안녕하세요', "'세상은 아름답습니다'", 'Python은', "'매우 유용합니다."]
따옴표로 묶인 문자열은 하나의 요소로 유지되어야 합니다.
해결책:
이 문제는 다음과 같은 정규 표현식을 사용하여 해결할 수 있습니다.
import re
def split_with_quotes(text):
return (re.findall(r'"(.*?)"|(\w+)', text))
위 코드는 다음과 같이 작동합니다.
re.findall()
함수는 정규 표현식과 일치하는 모든 서브 문자열을 찾습니다.- 첫 번째 괄호 그룹 (
"(.*?)"
)은 따옴표로 묶인 문자열을 찾습니다. - 두 번째 괄호 그룹 (
(\w+)
)은 따옴표가 없는 단어를 찾습니다. findall()
함수는 일치하는 모든 서브 문자열을 리스트로 반환합니다.
예시:
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
result = split_with_quotes(문장)
print(result)
출력:
['안녕하세요', "'세상은 아름답습니다'", 'Python은', "'매우 유용합니다."]
설명:
- 정규 표현식
"(.*?)"
는 다음과 같이 작동합니다."
: 따옴표 문자를 나타냅니다.(.*?)
: 0개 이상의 문자를 나타냅니다.?
: 최소한 0개 이상의 그룹을 나타냅니다.
- 정규 표현식
(\w+)
는 다음과 같이 작동합니다.\w
: 문자, 숫자 또는 밑줄을 나타냅니다.
참고:
- 위 코드는 단순한 예시이며, 더 복잡한 요구 사항에 맞게 조정될 수 있습니다.
- 다른 정규 표현식 라이브러리나 모듈을 사용할 수도 있습니다.
import re
def split_with_quotes(text):
return (re.findall(r'"(.*?)"|(\w+)', text))
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
result = split_with_quotes(문장)
print(result)
import re
: 정규 표현식 모듈을 가져옵니다.def split_with_quotes(text)
:text
라는 이름의 문자열을 입력으로 받는 함수를 정의합니다.return (re.findall(r'"(.*?)"|(\w+)', text))
: 정규 표현식으로 문자열을 분할하고 결과를 반환합니다.r'"(.*?)"|(\w+)'
은 정규 표현식 패턴입니다.
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
: 분할할 문자열을 변수에 저장합니다.result = split_with_quotes(문장)
:split_with_quotes
함수를 사용하여 문자열을 분할하고 결과를 변수에 저장합니다.print(result)
: 결과를 출력합니다.
['안녕하세요', "'세상은 아름답습니다'", 'Python은', "'매우 유용합니다."]
파이썬에서 공백 기준 문자열 분할 (따옴표 포함 문자열 유지) - 대체 방법
앞서 설명한 방법 외에도 파이썬에서 공백 기준으로 문자열을 분할하면서 따옴표로 묶인 문자열은 하나의 요소로 유지하는 방법은 여러 가지가 있습니다.
str.partition() 사용:
import re
def split_with_quotes(text):
return [part for part in text.partition('"')[::2] if part]
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
result = split_with_quotes(문장)
print(result)
str.partition()
메서드는 문자열을 세 개의 부분으로 나눕니다. 첫 번째 부분은 지정된 구분 문자가 나타나기 전까지의 문자열이고, 두 번째 부분은 구분 문자 자체이며, 세 번째 부분은 구분 문자 이후의 문자열입니다.- 위 코드에서는
str.partition('"')
을 사용하여 문자열을 따옴표 기준으로 세 개의 부분으로 나눕니다. part for part in text.partition('"')[::2]
는 파티셔닝 결과의 홀수 번째 부분 (따옴표와 문자열)만 선택하여 새로운 리스트에 추가합니다.if part
는 빈 문자열이 아닌 경우에만 파티셔닝 결과를 리스트에 추가합니다.
zip()과 itertools.chain() 사용:
import itertools
def split_with_quotes(text):
return list(itertools.chain.from_iterable(zip((False, True) * text.count('"'), text.split('"'))))
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
result = split_with_quotes(문장)
print(result)
itertools.chain.from_iterable()
함수는 여러 반복 가능한 객체를 하나의 반복 가능한 객체로 연결합니다.zip((False, True) * text.count('"'), text.split('"'))
은 다음과 같은 두 개의 반복 가능한 객체를 연결합니다.- 첫 번째 반복 가능한 객체는
False
와True
를 번갈아text.count('"')
번 반복하는 객체입니다. 이는 따옴표가 있는지 없는지를 나타냅니다. - 두 번째 반복 가능한 객체는 문자열을 따옴표 기준으로 분할한 결과입니다.
- 첫 번째 반복 가능한 객체는
list()
는 반복 가능한 객체를 리스트로 변환합니다.
re.sub()과 lookahead/lookbehind 사용:
import re
def split_with_quotes(text):
return (re.sub(r'"(.*?)"|(\w+)', r'\1 \2', text).split())
문장 = "안녕하세요 '세상은' 아름답습니다. Python은 '매우' 유용합니다."
result = split_with_quotes(문장)
print(result)
re.sub()
함수는 문자열을 정규 표현식 패턴과 일치하는 다른 문자열로 바꿉니다.r'"(.*?)"|(\w+)', r'\1 \2'
는 다음과 같은 치환을 수행합니다."(.*?)"
: 따옴표로 묶인 문자열을 그대로 유지합니다.(\w+)
: 따옴표가 없는 단어를 공백으로 바꿉니다.
.split()
은 바뀐 문자열을 공백 기준으로 분할합니다.
- 위에 제시된 방법들은 모두 동일한 결과를 제공하지만, 각각 장단점이 있습니다.
str.partition()
은 가장 간결하지만, 따옴표가 여러 개인 경우 동작이 예상대로 되지 않을 수 있습니다.zip()
과itertools.chain()
은 코드가 다소 복잡하지만, 따옴표가 여러 개인 경우에도 정확하게 작동합니다.re.sub()
은 정규 표
python regex