728x90
더보기

오늘은 파이썬을 통한 몇가지의 정규 표현식에 관하여 글을 적고자 합니다. 

일단 글 쓰기에 앞서, 저는 자바로 취업을 하였지만 회사의 요구에 의해 파이썬으로 다시 개발을 하고있는 0년차 개발자입니다. 

많은 블로그들이 양질의 글들을 공유를 하고있어서 정규 표현식의 모든것들을 설명하지 않으려고합니다 양해 부탁드립니다. 

정규 표현식

                     

                             정규 표현식( regular expression, as regexp or regex, rational expression)정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

 

컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 현재 많은 프로그래밍 언어, 텍스트 처리 프로그램, 고급 텍스트 편집기 등이 정규 표현식 기능을 제공한다. 일부는 자바스크립트루비Tcl처럼 문법에 내장되어 있는 반면 닷넷 언어자바파이썬POSIX CC++ (C++11 이후)에서는 표준 라이브러리를 통해 제공한다.

그 밖의 대부분의 언어들은 별도의 라이브러리를 통해 정규 표현식을 제공한다.

정규 표현식은 검색 엔진워드 프로세서와 문서 편집기의 찾아 바꾸기 대화상자, 그리고 sedAWK와 같은 문자 처리 유틸리티, 어휘 분석에 사용된다.

-위키백과-


기본 개념 
             

주로 패턴(pattern)으로 부르는 정규 표현식은 특정 목적을 위해 필요한 문자열 집합을 지정하기 위해 쓰이는 식이다. 문자열의 유한 집합을 지정하는 단순한 방법은 문자열의 요소나 멤버를 나열하는것이다. 
3개의 다른 문자열이 포함하는 집합은 패턴으로 지정이 가능하며 이러한 패턴은 3개의 문자열을 각각 일치(match)시킨다고 합니다. 

예를 들면 ) "Handel", "Händel", "Haendel" 을 H(ä|ae?)ndel 으로 지정가능합니다. 

 

Boolean "|" or 이라고 표현하는 수직선은 여러 항목 중 선택하기 위해 구분합니다. gray|grey 는 둘중 하나의 값이 일치하는것입니다. 

 

group()괄호를 사용하면 연산자의 범위와 우선권을 정의할수 있습니다. 예를들어 gray|grey 와 gr(a|e)는 gray and grey 집합을 둘 다 기술하는 동일 패턴입니다.

 

물음표 ? 는 0번 또는 1차례까지의 발생을 의미한다. 이를테면 colou?r는 "color"와 "colour"를 둘 다 일치시킨다.

별표 * 는 0번 이상의 발생을 의미한다. 이를테면 ab*c는 "ac", "abc", "abbc", "abbbc" 등을 일치시킨다.

덧셈 기호 + 는 1번 이상의 발생을 의미한다. 이를테면 ab+c는 "abc", "abbc", "abbbc" 등을 일치시키지만 "ac"는 일치시키지 않는다.

 

{n} 정확히 n 번만큼 일치시킨다.

{min, } 는 min 번 이상만큼 일치 시킵니다. 

{min, max} 는 적어도 "min"번만큼 일치 시키지만 "max"번을 초과하여 일치시키지는 않는다.

 

더보기

제가 이 블로그에 글을 적는것보다 가독성이 더 좋은 위키백과 링크를 달아드리겠습니다. 

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

 

이제 정규 표현식으로 원하는 값을 가져와봅시다. 

일단 제가 정규표현식을 사용해서 무엇을 했는지에 대해 간단하게 소개해드리겠습니다. 

Udemy로 제가 수업듣고있는 엘라스틱서치의 강의 제목과 시간을 가져와서 Excel파일로 스케쥴을 만들고싶었습니다. 

대충 총 145개의 강의로 이루어져있고 제목 그리고 시간을 가져오고싶었습니다.

 

제가 쓴 정규표현식으로는 (\w+),[^분0-9\s] 입니다.  []정규표현식을 표현할때 ^ 는 부정입니다.

즉 ^a-z 이면 a-z  빼고 라는 의미입니다. 

 

 

 

Elasticsearch Answers: The Complete Guide to Elasticsearch

Learn Elasticsearch from scratch and begin learning the ELK stack (Elasticsearch, Logstash & Kibana) and Elastic Stack.

www.udemy.com

 

 

페이지에서 드래그로 copy 했을때 처음 값은 대충 이런 모습이었습니다. 

밑에 문법에서는 ##분 의 값과 \s(space 를 표현하며 공백 문자를 의미한다.) 만 출력하는 식입니다. 

findall 로 '분'을 포함한 값을 찾아주고 리스트 시킵니다. 

이후에 for문으로 text에 '분' 포함되면 값을

저장해주라고 합니다 .

print(text) 를 하면 리스트화 되어서 값이 나오지만 *text에 \n을 주게되면 값의 출력이 세로로 나오게 됩니다. 

값을 평범하게 print(text)로 하게되면 list 형태로 값이 나온다. 

문장 또한 마찬가지로 영단어만 필요하기에 [^A-Za-z] 해주시면 쉽게 값을 가져올수있습니다. 

더보기

 

#re의 기능중 하나인 sub(자르기)로 정규표현식 사용
text = re.sub(r'[^분0-9]','',text)
'''text에서 분과 숫자를 제외한것을 잘라서 '' <- 즉 공백없게 만들어라
그리고 re에 다른 기능인 findall(은 정규식과 매치되는 모든 문자열을 리스트형식으로 리턴한다.)
사용하여서 '(\w+)분?' (\w+)는 숫자와 모든 언어를 포함하는것 분? 는 분을 포함하는 것
즉 모든숫자단어+분이 포함되는 것을 찾아주라는 기능입니다. '''
text=re.findall(r'(\w+)분?',text)
# 그 이후 for 문으로 만약 분이 포함된다면 값을리스트해주라는 얘기입니다.
text = [s for s in text if '분' in s]
'''그리고 print를 해주면되는데 여기서 리스트로 되어있는 text변수를 *text,sep='\n'을 해줌으로써 
리스트의 세로출력이 완성이 됩니다. for 루프를 돌리거나 pprint 모듈을 임포트하지 않고도, 
한 줄의 코드로 처리할 수 있어서 매우 편리하지 않나요?
우선 배열 앞에 * 연산자를 붙여서 함수를 호출하면 마치 여러 개의 인자를 넘긴 효과가 납니다.
그리고 print() 함수에는 가변 길이의 인자를 넘길 수 있는데요. 
기본적으로는 공백을 구분자로 사용합니다.
sep 옵션으로 이 구분자를 다른 문자로 바꿀 수가 있습니다.'''

 

728x90

'Language > python' 카테고리의 다른 글

numpy -인덱싱 / 슬라이싱  (0) 2022.06.21
numpy - ndarray 데이터 형태 바꿔보기  (0) 2022.06.21
numpy- 기초  (0) 2022.06.21
파이썬 기초-3(입출력문)  (0) 2022.06.15
파이썬 기초 -2  (0) 2022.06.15
복사했습니다!