2020년 6월 7일 일요일

정규식 사용하기 in Python regexp , 정규 표현식, re 예제, 파이썬



정규식을 사용하는 이유는 크게 3가지가 있습니다.
1. 문자열에서 특정 패턴이 있는지 확인하기
2. 문자열에서 특정 패턴을 검출하여 추출하기
3. 문자열에서 특정 패턴을 검출하여 제거하기

1번은 2,3을 하기 위한 기본적인 동작입니다. 


정규식 패턴 알아내기


문제의 문자열을 준비합니다.
" [Data Hello] Hello [data] data "
1. [문자열] 의 패턴이 있는지 확인합니다.
2. [문자열] 의 패턴이 추출
3. [문자열] 의 패턴을 제거

http://www.regexr.com/ 접속해서 어떤 정규식을 사용할지 찾아야합니다. 미리 테스트 해볼 수 있습니다.


그리고 적당한 규칙을 입력합니다.

어떤 정규표현식을 넣으면 [ ]안에 값만 나올지 생각 해보세요. 정답은 아래에 있습니다.
정규 표현식에 익숙하지 않은 사람은 쉽지않습니다. 해당 예제는 [ ]가 중복되어 있어서
 조금 어려운 경우 입니다.


















정답은 입니다.
\[[^\[]*\]


각각의 의미는 다음과 같습니다.
시작 : \[ = 특수 문자 [ 를 표현하기 위한 방법입니다. 정규식에서 특수문자를 표현할때 \ 표시를 하게 됩니다.

마지막 : \] = 시작 부분과 같습니다. 

시작 조건과 마지막 조건을 빼고 나면 [^\[]* 가 남습니다.
마지막 * 은 앞쪽 [ ] 사이의 문자가 0번 이상 반복된다는 의미이고  ^\[ 는 [ 문자가 아니라는 의미 입니다.
종합 해보자면 [로 시작하고 ] 로 끝나며 중간에는 [ 가 들어가 있지 않는 패턴이 됩니다.


Python 에서

각각에 대해 Python에서 어떻게 처리하는 알아 보도록 하겠습니다.
1. [문자열] 의 패턴이 있는지 확인합니다.
2. [문자열] 의 패턴이 추출
3. [문자열] 의 패턴을 제거

소스 코드


import re

p = re.compile(r"\[[^\[]*\]")

print("**** 1 ****")
result = p.findall(" [Data Hellox Hello [datax data ")
print(type(result))
print(result)
print(len(result))


print("**** 2 ****")
result = p.findall(" [Data Hello] Hello [data] data ")
print(result)

result = p.finditer(" [Data Hello] Hello [data] data ")
for r in result: 
	print("group:",r.group())
	print("start:",r.start())
	print("end:",r.end())
	print("span:",r.span())


print("**** 3 ****")
data = re.sub(r"\[[^\[]*\]",""," [Data Hello] Hello [data] data ")
print(data)
print("replace XX")
data = re.sub(r"\[[^\[]*\]","XX"," [Data Hello] Hello [data] data ")
print(data)


match를 써도 되지만 findall과 finditer 함수를 사용하였습니다. 이것 하나만 제대로 알아도 match는 안써도 되리라 생각됩니다.

3번 case의 경우 2번에서 찾은 문자열을 replace해도 됩니다. 하지만 sub라는 함수가 준비되어있어서 예제로 만들어 보았습니다.

실행 결과

**** 1 ****
<class 'list'>
[]
0
**** 2 ****
['[Data Hello]', '[data]']
group: [Data Hello]
start: 1
end: 13
span: (1, 13)
group: [data]
start: 20
end: 26
span: (20, 26)
**** 3 ****
  Hello  data
replace XX
 XX Hello XX data


















댓글 없음:

댓글 쓰기