-
[python] Regular Expression(정규표현식) #Step2파이썬 2021. 10. 23. 13:05728x90

정규표현식Regular expression) #step2
💢자주사용되는 문자
의미 내용 . 임의의 한문자를 의미 ? 문자가 존재하거나 존재하지 않음(0,1) * 문자가 미존재 또는 무한대로 존재(0~) + 문자가 한번 이상 무조건 존재(1~*) ^ 기호 바로 뒤의 문자로 문자열이 시작 $ 기호 바로 앞의 문자로 문자열이 끝남 {m} m만큼 반복 {m, n} m~n만큼 반복 가능 \\ 역슬래쉬ㅜ 글자 자체를 검색 \d 모든 숫자를 검색, [0-9]와 동일 \D [^0-9]와 동일, 숫자를 제외한 모든 문자를 검색 \s 공백을 검색(space) \S 공백이 아닌 문자를 검색 \w 숫자 또는 문자를 검색[a-zA-Z0-9] word를 표현하며 \W 알파벳, 숫자가 아닌 문자를 의미[^a-zA-Z0-9] \b 문자와 공백 사이의 문자를 의미 \B 문자와 공백 사이가 아닌 문자를 의미 \d digit의 약자로 숫자를 의미 \D non digit를 표현하며 숫자가 아닌 것을 의미 💢패턴에 매칭되는 모든 문자열 가져오기
- search() - 문서 내부(포함)의 패턴에 해당하는 첫번째 데이터 검색
- findall() - 문서 내부에 패턴에 해당하는 모든 데이터를 list 타입
- sub('패턴', '변경문자열', '문자열', 변경횟수) : 패턴과 일치되는 부분을 다른 문자로 변경
- split() : 주어진 문자열을 특정 패턴을 기준으로 분리
✅search()
코드
#? encore 9234 playdata 2345 .. # 2로 시작하는 4자리 문자 포함 여부 검증 data = re.search('2\d{3}', 'encore 9234 2222 playdata 2345 ..') print(data)결과값
<re.Match object; span=(12, 16), match='2222'>search()는 2로 시작하는 4자리 숫자중 가장 앞에 있는 2222를 검색한다.
✅findall()
➰코드
import re data = re.findall('2\d{3}', 'encore 9234 playdata 2345 ..gwg 2456') print(data) print(type(data)) # <class 'list'>➰결과값
['2345', '2456'] <class 'list'>findall은 조건에 해당하는 모든 것들을 리스트에 담아주는 역할을 수행한다. 타입을 찍어봤을때 list인것을 확인할 수 있다.
➰심화적용
파일안에 있는 글들은 읽고 데이터로 쭉 뽑아와 그안에서 내가 뽑고자 하는 것들을 뽑아보도록 하자
- dataSet/poem.txt 파일 내부의 데이터 중에서 "내가" 단어 존재여부 list로 만들기
➰코드
datas = [] with open('dataSet/poem.txt', 'r', encoding='utf-8') as f: datas = f.read() print(datas) data = re.findall("내가", datas) print(data, "내가 개수 :" , len(data))➰결과값
(datas 라는 list 출력값)
내 속엔 내가 너무도 많아 당신의 쉴 곳 없네
내 속엔 헛된바램들로 당신의 편할 곳 없네
내 속엔 내가 어쩔 수 없는 어둠 당신의 쉴 자리를 뺏고
내 속엔 내가 이길 수 없는 슬픔 무성한 가시나무숲같네바람만 불면 그 메마른가지 서로 부대끼며 울어대고
쉴곳을 찾아 지쳐 날아온 어린새들도 가시에 찔려 날아가고
바람만 불면 외롭고 또 괴로워 슬픈 노래를 부르던 날이 많았는데내 속엔 내가 너무도 많아서 당신의 쉴 곳 없네
바람만 불면 그 메마른가지 서로 부대끼며 울어대고
쉴곳을 찾아 지쳐 날아온 어린새들도 가시에 찔려 날아가고
바람만 불면 외롭고 또 괴로워 슬픈 노래를 부르던 날이 많았는데내 속엔 내가 너무도 많아서 당신의 쉴 곳 없네
data출력값
['내가', '내가', '내가', '내가', '내가'] 내가 개수 : 5
✅split()
➰코드
data = re.split('2\d{3}', 'encore 9234 playdata 2345 data 2456 test') print(data) print(type(data))➰결과값
['encore 9234 playdata ', ' data ', ' test'] <class 'list'>split()은 정규표현식에 해당하는 것들은 기준으로 데이터들을 쪼개서 list화 시켜주는다는 것을 알 수 있다.
2로 시작하는 4자리 숫자들을 기준으로 데이터들이 쪼개져 list타입의 data가 뽑힌것을 알 수 있다.
✅sub()
sub('정규표현식', '바꾸고자 하는 형태', 바꾸고자 하는 데이터)
➰코드
data = re.sub('2\d{3}', '100', 'encore 9234 playdata 2345 data 2456 test') print(data) data = re.sub( '[0-9]', 'n', 'encore 9234 playdata 2345 data 26 test') print(data) data = re.sub( 'apple | orange', '과일', 'apple 9234 orange 2345 data 26 test') print(data)➰결과값
encore 9234 playdata 100 data 100 test encore nnnn playdata nnnn data nn test 과일9234과일 2345 data 26 test➰sub() 적용 단계
- 첫 번째 파라미터에 적용시키고자하는 정규표현식 작성
- 두 번째 파라미터에 내가 바꾸고자 하는 형태를 작성
- 세 번째 파라미터에 바꾸고자 하는데이터 기입
그루핑
abc를 반복 시키고 싶은 경우가 있다고 하자. abc+ 이렇게 할경우 +의 효과가 c의만 적용되게 된다. 이럴때 ()를 사용하여 abc를 (abc)+형태로 그룹화 시켜주면 된다.
➰코드
>>> p = re.compile('(abc)+') >>> m = p.search('abcabcabc OK?') >>> print(m) <re.Match object; span=(0, 9), match='abcabcabc'> >>> print(m.group()) abcabcabc다음예를 보자
➰코드
>>> p = re.compile(r"\w+\s+\d+[-]\d+[-]\d+") >>> m = p.search("park 010-1234-1234")위에는 이름 + " " + 전화번호 형태의 문자열을 찾는 규칙이다.
이름만 뽑아개고 싶을때 아래와 같이 할 수 있다.➰코드
>>> p = re.compile(r"(\w+)\s+\d+[-]\d+[-]\d+") >>> m = p.search("park 010-1234-1234") >>> print(m.group(1)) park\w+ 부분을 (\w+)로 그룹화 시킨후 첫번째로 그룹화 된 부분이기 때문에 group(1)을 하면 이름 부분만 뽑아 올 수 있다.
group(인덱스) 설명 group(0) 매치된 전체 문자열 group(1) 첫번째 매치된 전체 문자열 group(2) 두번째 매치된 전체 문자열 group(n) 매치된 전체 문자열 그루핑은 중첩으로도 가능하며 안에 인덱스 값은 밖 에서 안으로 갈 때 인덱스는 증가한다
➰코드
>>> p = re.compile(r"(\w+)\s+((\d+)[-]\d+[-]\d+)") >>> m = p.search("김지명 010-6614-1234") >>> print(m.group(1)) >>> print(m.group(2)) >>> print(m.group(3))➰결과값
김지명 010-6614-1234 010💢그루핑 활용
✅재참조
그루핑의 또 하나 좋은점은 문자열을 재참조 할 수 있다는 점이다.
import re p = re.compile(r'(\b\w+)\s+\1') print(p.search('Korean in in the Asia').group()) >>> in in저기서 숫자는 앞에 그루핑되어있는(\b\w+)를 의미하고 공백뒤에 동일한 문자가 올 때 찾아주는 것을 의미한다
✅이름붙이기
(?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)위에 코드와 같은 형태로 우리는 특정한 그룹에 이름을 지정할 수가 있다.
위에서 사용했던 것을 그대로 가져와 적용 시켜보자import re p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)") m = p.search("김지명 010-6614-1234") print(m.group("name")) print(m.group("phone")) >>> 김지명 >>> 010-6614-1234✅이름 붙혀서 재참조
import re p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)') print(p.search('Korean in in the Asia').group())위에서 학습했던 이름붙이기와 재참조를 결합하여 특정한 그룹에 이름을 주고 그 이름을 이용하여 재참조를 한 코드이다
💢전후방탐색
전후방 탐색이란 원하는 뭔자열을 범위를 지정해 뽑아내는것을 의미한다
- 전방탐색
- 긍정형
data = re.search('.+(?=:)', 'http://www.google.com') print(data.group()) >>>http- 부정형위 코드는 foo.bar, autoexec.bat, sendmail.cf와 같은 파일이름 + . + 확장자를 나타내는 정규식이다. 여기서 확장자가 bat인 파일은 제외해야 할 경우 어떤식으로 할 수 있을까??!를 사용하여 bat확장자를 처리 할 수 있다. bar도 포함시키고 싶을때는 bat|bar 이런식으로 사용할 수 있다.
.*[.](?!bat$).*[.].*$
- 후방탐색
- 말 그대로 특정한 문자열을 지정하면 그 뒤에 있는 값들을 뽑아낼 수 있다.
data = re.search('(?<=//).+', 'http://www.google.com') print(data.group()) >>> www.google.com참고자료 영상:https://www.youtube.com/watch?v=dTDoTR0MXjU&list=RDCMUCQNE2JmbasNYbjGAcuBiRRg&start_radio=1&rv=dTDoTR0MXjU&t=4)
참고자료: https://wikidocs.net/4309'파이썬' 카테고리의 다른 글
[python]🔑이진탐색 알고리즘 (0) 2021.10.24 [python]정렬 알고리즘 (0) 2021.10.23 [python] Regular Expression(정규표현식) #Step1 (0) 2021.10.23 파이썬 기초7,Quiz (0) 2021.07.19 파이썬 class_예제문제 (0) 2021.07.18