반응형
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( )
반응형