xython_regex

jfinder(기본) - 정규표현식의 기본 사용방법 – 05

작성자
sjpark
작성일
2024-12-09 20:43
조회
11

jfinder(기본) - 정규표현식의 기본 사용방법 – 05

기능
1 match 정규표현식으로 정의한 형식과 문자열이 맞는지
2 search 정규표현식으로 정의한 형식에 맞는 것을 찾는 것
(객체로 돌려주는 것, 문자열의 몇번째부터 맞는지를 알려면 이것을 사용)
3 findall 정규표현식으로 정의한 형식에 맞는 모든것 찾는 것
(결과값만 리스트로 돌려주는 것)
4 finditer 정규표현식으로 정의한 형식과
(반복가능한 객체로 돌려주는 것)
아래에 입력된 이메일을 확인하는 것을 정규표현식으로 나타내 보면, 아래와 같고, 그리고 자주 사용하는 것들은 이미 다 정규표현식으로 되어있으니, 너무 걱정마시고 단지 자기가 만들어서 어떻게 사용할지를 알아야 한다는 것입니다

위의것처럼 대략적으로 보시면 대충은 이런식으로 사용이 되는구나라고 알수잇을것입니다.

예를 들어 아래와 같은 것이 있는 방법을 표현해보면
입력문자로 들어온 이메일주소가 맞는지 확인하는 것 abcdef@naver.com ([a-zA-Z0-9_.+-]+)@[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9_.+-]+\.
abcdef ([a-zA-Z0-9_.+-]+) (숫자, 알파벳, .+-)가 1개이상와야함
@ @
naver [a-zA-Z0-9_.+-]+ (숫자, 알파벳, .+-)가 1개이상와야함
. \.
com [a-zA-Z0-9_.+-]+\. (숫자, 알파벳, .+-)가 1개이상와야함
즉, 위의것은 어떤 문자열이 정규식으로표현된 방법의 문자열인지를 확인하는 것이며, 이것이 있는지 없는지를 위치부터 찾을수도 있는것이다

test_text = """abcdef라고쓰고(괄호)로 만들고나서 숫자를 123456하고 789로 써본다.
숫자로 만 된 010-일이삼사-5678을 가지고 test해보려고 합니다
"""

import re
test_text = """abcdef라고 ABCDEF도 소문자와 대문자를 함께쓴 abcdEFG쓰고(괄호1)로 만들고나서 숫자를 123456하고 789로 써본다.
숫자로 만 된 010-일이삼사-5678을 가지고 (괄호2)test해보려고 합니다
"""

re_sql = re.compile('[a-z]+')
result = re_sql.findall(test_text)
print("영어소문자만 찾는것 ===> ", result)

re_sql = re.compile('[0-9]+')
result = re_sql.findall(test_text)
print("숫자만 추출 ===> ", result)

word-image-2654-1.png

정규표현식이란

정규표현식 : 정해진규칙을 가진 표현식, 정규라는 단어가 좀 어색하지만, 초기학무의 대부분이 일본 것을 갖고온 한자라 그렇게 사용하는 것으로 알고있습니다.

뜻 : 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있다.(위키피디아)

반대로 이야기하면 규칙이 아닌 것은 찾을수 없다라는 의미도 됩니다. 상당히 복잡한 형태의 것도 찾을 수가 있으니, 잘 활용하시기를 바랍니다

이것고 프로그램 언어의 하나 이기 때문에 다른 언어들과 비슷한 형태를 갖지만, 단지 특화된 기능을 표현한 것입니다. 즉,
  • 어떤 의미를 가진 정의된 메타문자들이 있다는 것이고,
  • 사용하는 문법이 있다는 이야기 입니다
이제 이것에 대해서 공부를 해보고, 이것이 만들때는 어찌 잘 만들어 지는데, 다시 처다보면 상당히 찾기가 어려운 고대상형문자처럼 되어버립니다

그래서 만든 모듈이 jfinder라는 것으로 re문법을 만들어주기 쉽도록 표현방식을 바꾼것입니다

생각이상으로 정규표현식은 많은곳에 이미 사용되고잇습니다
  • 컴파일러의 파서부분에는 거의 다 들어감
  • 프로그램에서 규칙에 맞도록 했는지를 확인하는것또한 정규표현식에서 한다
  • 이메일, 주민번호등을 체크할때
정규표현식이라고 하는 re모듈은 문자열을 찾고 분석하는데 특화된 것이며, 거의모든 언어에서 사용이 가능합니다.

결국 문자열을 분석하는 방법은 기본적으로
  • 문자인지 숫자인지를 구분하는 기능이 들가있을것이고
  • 얼마나 여러 번 반복된 것인지의 기능도 있을것이고
  • 특정한 문자가 들어가있는지 확인하는 방법도 잇을것이며
  • 위의것이 반대로 없는것만도 확인이 가능하도록..
뭐, 이렇게 기본적으로 생각을 해도 이러기능들이 들어가잇지 않을까 생각을 합니다

그러니 이런 것을 어떤 식으로 사용이 가능한지에 대해서 보면,

정규표현식의 기본적인 설명
분류 사용법 설명 비고
글자의 묶음이나 글자를 나타내는 표현 . 문자1개
\d, \D 숫자, 숫자가 아닌 것 [0-9] [^0-9]
\s 공백문자
\w 알파벳+숫자 [a-zA-Z0-9]
[abc] a,b,c 의 아무글자나 [a-c]로 나타내도 됨
[^abc] a,b,c이외의 아무글자나
[a-z] a부터z까지의 아무글자나 Utf-8기준의 문자코드의 연속된 것을 기준으로 파악
[abcdefghijklmnopqrstuvwxyz]과 같음
[a-df] a에서d까지의 문자와 f를 찾을 때
단어의 경계 표시방법 ^ab$ 시작을 나타내는 ^과 끝을 나타내는 $ 입력으로 들어오는 문자열의 시작과 끝까지의 모든 글자가 ab인 것을 찾는 것
메타문자의 사용법 \. \* \\
\^ \$ \t
정규표현식에 사용되는 특수문자들을 문자로 나타내는 방법 역슬레시를 붙여주면 된다
그룹화 및 순서정의 (abc) 그룹화 괄호로 된 부분을 그룹화하여 차후에 조건에 맞는 것을 찾으면, 그룹 번호대로 다른 기능을 넣을수도 있다
[(ab)(bc)(df)] ab와 bc, df가 있는지
abc(?=def) 앞뒤순서를 지정
def앞에만 나타나는 abc를 찾고싶을 때
4가지 종류가 있습니다
횟수정의방법 * 없을수도있으며~무제한
+ 1번~무제한
a{3,5} a글자를 3~5번 반복하는 것 찾기
조건 ab|cd ab또는 cd인 것