본문 바로가기
  • Hello_
Python

[Python] re를 활용하여 문자열을 리스트로 변환하기

by LDwDL 2023. 2. 12.
728x90
반응형

본 포스팅에서는 리스트 구성의 문자열을 리스트 형태로 변환하는 법에 얘기하고자 합니다.

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 모듈을 잘 활용하실 수 있습니다.

728x90
반응형

댓글