본 포스팅에서는 리스트 구성의 문자열을 리스트 형태로 변환하는 법에 얘기하고자 합니다.
re 모듈
만약 아래와 같이 유관으로는 리스트지만 형식은 문자열일 때, 이 문자열 내부의 요소들을 그대로 가져와 리스트로 구성해보고자 합니다.
'(-73.53,210.48,-94.70)' # type -> str
'[92.41,20.49,12.45]' # type -> str
'[-92.41,-20.49,-12.45]' # type -> str
이때 유용하게 사용할 수 있는 모듈이 바로 're'입니다.
Python에서 "re" 라이브러리는 "regex" (정규 표현식) 라이브러리입니다. 문자열에서 패턴을 검색하고 그 패턴에 따라 문자열에 대한 연산을 수행할 수 있게 해 줍니다..
정규 표현식은 텍스트 처리에 대한 강력한 도구이며, "re" 라이브러리는 Python에서 이를 사용할 수 있도록 다양한 기능을 제공합니다. 정규 표현식에 대한 내용은 아래 링크를 참고하시면 됩니다.
정규표현식 (Regex) 정리
본 포스팅에서는 문자열에 사용되는 형식 언어인 정규표현식에 대해 정리하고자 합니다. 정규 표현식 (Regex) [Anchors] ^x 문자열의 시작 혹은 x 문자로 시작됨을 의미 \A 문자열의 시작 x$ 문자열의
baembaembaem.tistory.com
문자열 -> 리스트
예시로 '(-73.53,210.48,-94.70)'이란 문자열을 리스트로 변환해 봅시다.
test = '(-73.53,210.48,-94.70)'
변환에 들어가기에 앞서 3가지 조건을 인지하고 들어가야 합니다.
1. 해당 문자열 안의 요소들은 float이기 때문에 '.' 존재
2. 음수일 수도 있고 양수일수도 있음
3. ','로 나뉨
첫 번째로 '\d'를 통해 숫자들을 찾을 수 있습니다.
import re
re.findall(r'\d', test) # 숫자 찾기 찾기
# ['7', '3', '5', '3', '2', '1', '0', '4', '8', '9', '4', '7', '0']
이후 2번째 조건으로 인해 ‘-’가 있거나 없거나 모두 찾아줘야 합니다.
정규표현식에서 ? 는 앞에 문자를 0개 혹은 1개를 찾아주기 때문에 '-?'를 통해 앞에 ‘-’가 있다면 포함해서 반환해 주고 없다면 없는대로반환해 주도록 합시다.
re.findall(r'-?\d', test)
# ['-7', '3', '5', '3', '2', '1', '0', '4', '8', '-9', '4', '7', '0']
그리고 ‘\.’을 통해 끝에 ‘.’(comma)가 있어야 한다는 1번째 조건을 고려하여 해당하는 문자열을 반환해 주고,
re.findall(r'-?\d+\.', test)
# ['-73.', '210.', '-94.']
그 뒤에 숫자가 있으면 반환시켜 줍니다. 추가적으로 ‘+’를 사용하여 뒤에 소수점 몇 자리든 숫자가 끝날때끝날 때까지 찾아서 반환되게끔 합니다. 해당 예시로는 3번째 조건처럼 모두 소수점 둘째 자리 이후에 ‘,’(comma)가 있기 때문에 소수점 둘째 자리까지 반환이 됩니다.
re.findall(r'-?\d+\.\d', test)
# ['-73.5', '210.4', '-94.7']
re.findall(r'-?\d+\.\d+', test)
# ['-73.53', '210.48', '-94.70']
그럼 이젠 리스트 내부에 요소들의 형태가 갖춰졌습니다. 요소들을 str에서 float으로 mapping만 진행해 주면 끝.
float_list = [float(n) for n in re.findall(r'-?\d+\.\d+', test)]
print(float_list)
# [-73.53, 210.48, -94.7]
다른 예시
다른 예시들도 모두 동일하게 접목이 잘되는 것을 확인했습니다.
test_1 = '[92.41,20.49,12.45]'
float_list = [float(n) for n in re.findall(r'-?\d+\.\d+', test_1)]
print(float_list)
# [92.41, 20.49, 12.45]
test_2 = '[-92.41,-20.49,-12.45]'
float_list = [float(n) for n in re.findall(r'-?\d+\.\d+', test_2)]
print(float_list)
# [-92.41, -20.49, -12.45]
위는 예시일 뿐 문자열의 형태에 따라 정규식을 잘만 적용하신다면 re 모듈을 잘 활용하실 수 있습니다.
'Python' 카테고리의 다른 글
[Python] 파이썬에서 chatGPT 사용하는 법 (0) | 2023.02.23 |
---|---|
[Python] 여러개의 이미지 한번에 시각화 - matplotlib (0) | 2023.02.18 |
[Python] sys.modules, __getattr__, __setattr__ 활용하기 (0) | 2023.02.11 |
[Python] try except 활용하여 오류 모아보기 (0) | 2023.02.08 |
[Python] 3D 배열의 Dice score 코드 만들기 (segmentation 평가) (0) | 2023.01.09 |
댓글