본문 바로가기

Python/크롤링

정규표현식

반응형

python 정규 표현식 정리

 

1) 기호표

패턴 문자 의미

^ 1. 문자열 시작 2. not
. 줄바꿈 문자를 제외한 1글자
$ 문자열 끝
[] 문자열 집합
e.g. [xyz] == [x-z] e.g. [^a] : a를 제외한 모든 문자
| or
\d == [0-9]

 

2) re.sub( reg, 바뀔 문자열, 바꿀 문자열)

[1] 단순 치환

 

특정 단어 치환

import re

text = 'I like red hair and grey eyes'
re_text = re.sub('red|grey', 'brown', text)

print(re_text) 

-----------------------------------------------------------------------------------
I like brown hair and brown eyes

 

특정 패턴 치환

```python
text = '[재료] CPU 3개 | RAM 모듈 3개 | 케이블 타이 3개 |'
regex = '(\[[가-힣]+\])+'
result = re.sub(regex,'|' ,text)
print(result)

-------------------------------------------------------------------------------------
| CPU 3개 | RAM 모듈 3개 | 케이블 타이 3개 |
```

 

첫 줄만 치환

import re

text ='''\
010-1234-5678 Park
011-1234-5678 So
012-1234-5678 Yeon '''

re_text = re.sub('^[0-9]{3}-[0-9]{4}-[0-9]{4}',"***-****-****",text) 
print (re_text)

-----------------------------------------------------------------------------------
***-****-**** Park
011-1234-5678 So
012-1234-5678 Yeon

 

[2] flags argument

 

모든 줄 치환 (re.MULTIINE)

import re

text ='''\
010-1234-5678 Park
011-1234-5678 So
012-1234-5678 Yeon '''

re_text = re.sub('^[0-9]{3}-[0-9]{4}-[0-9]{4}',"***-****-****",text, flags=re.MULTILINE) 
print (re_text)

-----------------------------------------------------------------------------------
***-****-**** Park
***-****-**** So
***-****-**** Yeon

 

대소문자 구분 안 함 (re.IGNORECASE == re.I)

import re

text = '[ABCdefGHi]'

re_text1 = re.sub(r'[a-z]', '', text)
print(re_text1)

re_text2 = re.sub(r'[a-z]', '', text, flags = re.I)
print(re_text2)

-------------------------------------------------------------------
[ABCGH]
[]

 

[3] group

 

그룹핑 (?P<그룹명>reg)

text = '설탕 10g'

reg_grouping = '(?P<그룹명1>[가-힣 ]+)(?P<그룹명2>[0-9]+.*)?'

p = re.compile(reg_grouping)
m = p.search(text)

print(m.group('그룹명1'))
print(m.group('그룹명2'))

----------------------------------------------------------------------------
설탕
10g

 

그룹핑 치환 (?P<그룹명>reg) → \g<그룹명>

import re

text = """1. 감자는 깨끗이 씻어 껍질을 벗기고 강판에 갈아준다. 갈아낸 감자를 체에 밭쳐 감자즙과 녹말을 분리한다.
2. 분리된 감자 녹말에 갈아낸 감자를 다시 섞고 소금을 약간 넣어 반죽을 만든다.
3. 팬에 기름을 두르고 중불에서 반죽을 한 숟가락씩 얹어 노릇하게 양면을 부쳐낸다."""

# 불필요한 줄 바꿈 제거
regex = r'(\d\.\s*)'
result = re.sub(regex, r'\1', text)

print(result)

------------------------------------------------------------------------------
1. 감자는 깨끗이 씻어 껍질을 벗기고 강판에 갈아준다. 갈아낸 감자를 체에 밭쳐 감자즙과 녹말을 분리한다.
2. 분리된 감자 녹말에 갈아낸 감자를 다시 섞고 소금을 약간 넣어 반죽을 만든다.
3. 팬에 기름을 두르고 중불에서 반죽을 한 숟가락씩 얹어 노릇하게 양면을 부쳐낸다.
regex = r'[.](?P<step>[0-9]*)[.]'
result = re.sub(regex, r'.\n\g<step>.' ,text)
print(result)

( ) → \number

import re

text = '010-1234-5678'

re_text = re.sub(r'(\d{3})-(\d{4})-(\d{4})', r'(\1) \2-\3', text)
# \1, \2, \3은 괄호로 묶인 그룹을 의미함 (1번부터 시작됨)
print(re_text)

-----------------------------------------------------------------
(010) 1234-5678

 

3) re.findall

text = '오렌지 주스 12.5kgx 3'
reg = r'[\d+\.\d+]+(?:mg|kg|ml|q.s.|ui|g|l|L|KG|Kg|kG|G|ML)[\s](?:x|X)+[\s]*[\d+]'
ws = re.findall(reg, text)
ws

 

4) re.search( reg, text)

[1] 패턴의 시작과 끝

span( )

[2] search로 찾은 텍스트

group( )

 

 

반응형