본문 바로가기

코딩/Python

[Python/파이썬] 문자열 처리 정규 표현식(regular expression) - 2 : 실제 예시를 통한 이해

반응형

1편 : 2022.08.11 - [코딩/Python] - [Python/파이썬] 문자열 처리 정규 표현식(regular expression) - 1

2편 : 2022.09.03 - [코딩/Python] - [Python/파이썬] 문자열 처리 정규 표현식(regular expression) - 2 : 실제 예시를 통한 이해

 

 

 

  이전 포스팅에서 문자열 처리 정규 표현식에 대한 간단히 다뤄보았다.  이번에는 실제 업무적으로 마주칠 수 있는 상황 들에 대해 어떻게 정규 표현식을 적용할 수 있는지 간단한 사례를 정리해보았다. 실제 C언어에서 필요 한 부분을 파싱하는 업무를 진행하고 있고 해당 구문들을 사용하고 있다.

 

 

Case1. C/C++ for 반복문에서 변수명, 반복횟수 등을 구하기 위한 숫자,문자 추출

 

test 문자열 

text1 = "for(i=33, i<=99, i++)"

 

1) for문에서 i의 시작 숫자값을 구해보기(i=1에서 정수 1)

 

  - 먼저 문자열 분리 함수인 split을 써서 콤마(,) 단위로 리스트화 한다.

  - split 함수는 분리할 문자를 기준으로 리스트화 한다.

 

 

<코드>

text1 = text1.split(",")
print("1차분리 : ", text1)

 

<결과>

1차분리 :  ['for(i=33', ' i<=99', ' i++)']

 

 

  2) 첫번째 요소를 활용해 숫자 33만 뽑아내는 정규표현식 작성

 

  - 숫자만 포함하는 정규표현식 [0-9]이 1개이상 나와야 한다.

  - [0-9]+ 또는 [0,9]{1,} 적용

  - {1,}의 의미 : 앞 정규 표현식 규칙이 1번이상 반복되어야 한다는 의미이다. +랑 동일한 표현이다.

     즉, [0-9]{1,}의 의미는 숫자가 1번이상 나올 경우 매칭된다는 의미이다. Search이므로 문자열 전체에서 일치하는 부

     분을 찾는다.

   - 코드 중 .group( )은 매칭객체의 매칭값을 문자열로 표시한다.

 

 

<코드>

m1 = re.search("[0-9]{1,}", text1[0])
print(m1) #매칭 객체
start_num = m1.group() #매칭값
print(start_num) #출력

 

<결과>

<re.Match object; span=(6, 8), match='33'>
33

 

 

Case2. for문에서 조건을 나타내는 수식 부등호 뽑아보기

 

 

1) 위 text1을 분리한 결과에서 2번째 요소를 활용한다.

 

 

<코드>

text1 = text1.split(",")
print("조건문:", text1[1])

 

<결과>

조건문:  i<=99

 

 

2) 특수문자 (<, >, =)를 뽑아내는 정규표현식 작성

 

 

<코드>

m2 = re.search("[<>=]{1,}", text1[1])
print(m2)
exp = m2.group()
print(exp)

 

<결과>

<re.Match object; span=(2, 4), match='<='>
<=

 

 

Case3. 중괄호 [ ] 내부의 변수명 출력하기 (배열 내부 변수명)

 

 

test 문자열

text2 = "[var]"
text3 = "[ab4213]"

 

 

<코드>

m4 = re.search("[a-zA-Z0-9]+", text2)
print("text2 매칭정보: ", m4)
print("text2 매칭문자열: ", m4.group())

m5 = re.search("[a-zA-Z0-9]+", text3)
print("text3 매칭정보: ", m5)
print("text3 매칭문자열: ", m5.group())

 

<결과>

text2 매칭정보:  <re.Match object; span=(1, 4), match='var'>
text2 매칭문자열:  var
text3 매칭정보:  <re.Match object; span=(1, 7), match='ab4213'>
text3 매칭문자열:  ab4213

 

 

Case4. 변수 선언에서 실수값만 뽑아내기(부등호 포함)

 

test문자열

text4 = "Value1 = +36.9;"
text5 = "Value2 = -36.9;"
text6 = "Value3 = 103.323;"

 

 

<코드>

# case5. 실수값만 뽑아내기
m6 = re.search("[\s]{1,}[-+]{0,1}[0-9]+[.]{0,}[0-9]{0,}", text4)
print("text4 매칭 :", m6)
print("text4 매칭값 :", m6.group().strip())

m7 = re.search("[\s]{1,}[-+]{0,1}[0-9]+[.]{0,}[0-9]{0,}", text5)
print("text4 매칭 :", m7)
print("text4 매칭값 :", m7.group().strip())

m8 = re.search("[\s]{1,}[-+]{0,1}[0-9]+[.]{0,}[0-9]{0,}", text6)
print("text4 매칭 :", m8)
print("text4 매칭값 :", m8.group().strip())

 

- 정규표현식이 복잡하지만 하나씩 뜯어보면 간단하다.

  [\s]{1,} : 공백(Space)가 하나 이상 있는 경우

  [-+]{0,1} : 특수문자인 - 또는 +가 없을 수도있고 1개 나올 수도 있음.

  [0-9]+ : Case1에서 다뤘던 부분으로 숫자가 1개이상 나와야 함.

  [.]{0,} : 문자인 Dot(.)가 0개일 수도 있고 1개이상나올 수도 있음.

  [0-9]{0,} : 숫자가 0개일 수도 있고 1개이상 나올 수도 있음.

 - 이 정규표현식을 적용하면 text4, text5, text6 와 같은 여러 case의 실수값을 파싱할 수 있다.

 

 

<결과>

text4 매칭 : <re.Match object; span=(8, 14), match=' +36.9'>
text4 매칭값 : +36.9
text5 매칭 : <re.Match object; span=(8, 14), match=' -36.9'>
text5 매칭값 : -36.9
text6 매칭 : <re.Match object; span=(8, 16), match=' 103.323'>
text6 매칭값 : 103.323
728x90