Regular Expression : re 요약
정규표현식(正規表現式, Regular Expression)은
- 문자열을 처리하는 방법 중의 하나로
- 특정한 조건의 substring(문자열)을 '검색'하거나 '치환'하는 과정을
- 특정 문자열의 pattern을 기술하는 expression을 이용하여
매우 간편하게 처리 할 수 있도록 해준다.
주요 Tasks
RE를 통해 수행되는 것은 크게 다음의 세가지임.
- searching
- splitting
- replacing
이들 모두 특정 substring pattern에 대한 matching을 사용한다.
즉, matching, searching, splitting, replacing을 하는 방법에 대한 이해를 하면 RE를 효과적으로 사용가능하다.
compiled pattern
Python에서는 matching에 사용할 expression을 str로 사용하기도 하지만, 다음과 같이 이를 미리 compile해두고 그 결과값을 재사용할 수 있다. 이 경우, 보다 수행속도가 올라간다. (동작 결과는 같음)
compiledPattern = re.compile(pattern, flags=0)
사용되는 주요 flag를 간단히 살펴보면 다음과 같음.
re.I
: Ignores character case.re.M
: multiline 으로 동작.
여러 flag를 동시에 사용하려면 이들을 더한 값을 argument로 할당하면 됨.
re 모듈의 함수 기본 사용법.
re 모듈의 기능을 사용하는 방법은 일반적으로 다음과 같음.
# compile pattern으로 처리하는 경우.
compiledPattern = re.compile(rawPattern, flags=0)
compiledPattern.function(...)
# pattern을 그냥 raw string등으로 입력받는 경우.
# w/o compile
re.function(rawPattern, ..., flags=0)
re 모듈이 제공하는 기본 함수들
match()
source의 string에서 시작부분이 pattern과 matching되는지를 체크하고,
matching시 해당 부분을 output으로 반환.
사용법은 다음과 같음.
match(pattern, string, flags=0)
예제는 다음과 같음.
>>> mo = re.match(r"\d+", "067 Starts with a number")
>>> mo
<_sre.SRE_Match object; span=(0, 3), match='067'>
>>> mo.group()
'067'
>>> re.match(r"\d+", "Does not start with a number")
None
>>> if mo: # match returns an object; do this to see what matched
... print(mo.group())
...
067
search()
source의 string에서 pattern과 matching되는 부분이 있는지를 체크하고,
matching시 처음으로 matching된 부분을 output으로 반환.
사용법은 다음과 같음.
search(pattern, string, flags=0)
예제를 참고.
>>> mo = re.search(r"[a-z]+", "0010010 Has at least one 010 letter 0010010", re.I)
>>> mo
<_sre.SRE_Match object; span=(8, 11), match='Has'>
>>> # Case-sensitive version
>>> re.search(r"[a-z]+", "0010010 Has at least one 010 letter 0010010")
<_sre.SRE_Match object; span=(9, 11), match='as'>
re.I
flag를 사용하지 않은 경우,Has
에서 소문자엔as
부분이 처음으로 matching된 부분에 해당함.
다음과 같이 group
등으로도 활용가능함.
>>> import re
>>> source = 'Young Frankenstein'
>>> m = re.search('Frank', source)
>>> if m:
... print(m.group())
...
Frank
findall()
source의 string에서 pattern과 matching되는 부분이 있는지를 체크하고,
모든 matching된 부분을 overlapping없이 list로 반환.
사용법은 다음과 같음.
findall(pattern, string, flags=0)
예제는 다음과 같음.
>>> mo = re.findall(r"[a-z]+", "0010010 Has at least one 010 letter 0010010", re.I)
>>> mo
['Has', 'at', 'least', 'one', 'letter']
또 다른 예제.
>>> import re
>>> source = 'Young Frankenstein'
>>> m = re.findall('n', source)
>>> m # findall returns a list
['n', 'n', 'n', 'n']
>>> print('Found', len(m), 'matches')
Found 4 matches
split()
source를 pattern에 해당하는 부분들로 나눈 list를 반환
(나누는 기준으로 사용된 pattern들은 output에 포함되지 않음.)
사용법은 다음과 같음.
split(pattern, string, maxsplit=0, flags=0)
maxsplit
은 최대로 나눌 substring의 수임. 0일 경우 최대한으로 나누어지게 되며 기본설정임.
예제는 다음과 같음.
>>> mo = re.split(r"\W", "Hello, world!")
>>> mo
['Hello', '', 'world', '']
>>> # Combine all adjacent non-letters
>>> mo = re.split(r"\W+", "Hello, world!")
['Hello', 'world', '']
다른 예제
>>> import re
>>> source = 'Young Frankenstein'
>>> m = re.split('n', source)
>>> m # split returns a list
['You', 'g Fra', 'ke', 'stei', '']
sub()
source에서 mathcing되는 부분들을 주어진 새문자열로 바꾼 output을 반환.
추가적인 바꿀 새문자열 replacement
가 argument로 주어짐.
sub(pattern, repl, string, flags=0)
예제를 살펴볼 것.
>>> mo = re.sub(r"[a-z ]+", "[...]", "0010010 has at least one 010 letter 0010010")
>>> mo
'0010010[...]010[...]0010010'
또 다른 예제
>>> import re
>>> source = 'Young Frankenstein'
>>> m = re.sub('n', '?', source)
>>> m # sub returns a string
'You?g Fra?ke?stei?'
compile된 pattern을 사용하는 방식은 다음과 같음.
import re
# rawPattern = r'aaa'
rawPattern = r'\baaa\b' # 단어가 전체가 aaa인 경우만 해당함.
# compile pattern으로 처리하는 경우.
compiledPattern = re.compile(rawPattern, flags=0)
src = "aaa is an aaa. but aaabbb can be bbbaaa"
compiledPattern.sub("test",src)
결과는 다음과 같음.
test is an test. but aaabbb can be bbbaaa
match시 group에 이름을 지정하고 접근하기.
다음 예제를 참고
>>> source = '''I wish I may, I wish I might
... Have a dish of fish tonight.'''
>>> m = re.search(r'(?P<DISH>. dish\b).*(?P<FISH>\bfish)', source)
>>> m.group()
'a dish of fish'
>>> m.groups()
('a dish', 'fish')
>>> m.group('DISH')
'a dish'
>>> m.group('FISH')
'fish'
'Programming' 카테고리의 다른 글
[Python] for statement (0) | 2023.07.30 |
---|---|
[PyQt6] QSizePolicy 설정. (0) | 2023.07.03 |
[Python] str : Overloaded Operators (0) | 2023.07.02 |
[Python] pip 란 (Package Management System) (0) | 2023.06.22 |
[Python] Basic Methods of String (0) | 2023.06.21 |