자연어 처리(정규식)

푸른하늘·2024년 3월 18일
1

개발자 유아기

목록 보기
7/14

<Notes>

  • 자연어 처리 수업 필기 + 보충학습
  • 정규식 연습은 지루하지만 연습을 해놓으면 평생 도움이 된다

🆗 정규식(Regular expressions or regex)

정규식은 연속적인 문자들을 검색하는 제어방법이다. 뭐 문자열의 패턴을 표현하는 문자열이라고 이해해도 좋다. 특정한 문자열이나 문자 패턴을 찾는 데 사용되며, 매우 강력하고 유용한 도구이기 때문에 반드시 알아야 한다.

시작은 늘 쉽게, 진짜 기초 메타 문자만 조금 볼까?

. : 어떤 문자 하나를 나타낸다.
* : 바로 앞의 문자나 표현식이 0번 이상 반복되는 것을 나타낸다. 0번이면 없어도 된다는 뜻!
+ : 바로 앞의 문자나 표현식이 1번 이상 반복되는 것을 나타낸다.
? : 바로 앞의 문자나 표현식이 0번 또는 1번 등장하는 것을 나타낸다.
[] : 괄호 안에 있는 문자 중 하나를 나타낸다.
^ : 문자열의 시작을 나타낸다.
$ : 문자열의 끝을 나타낸다.
{n} : 정확히 n 번만큼 일치시킨다.
{n, } : n번 이상만큼 일치시킨다.
{n, m} : n번 이상 m번 이하 일치시킨다.

조금 더 자세하게 들어가보자! 특수 시퀀스까지!

\A : 지정된 문자가 문자열의 시작 부분에 있으면 일치 항목을 반환한다.
\w : 알파벳 문자나 숫자와 매치된다.
\W : 알파벳 문자나 숫자가 아닌 문자와 매치된다. 소문자를 바탕으로 아닌 것들을 매치하는듯
\d : 숫자와 매치된다. [0-9]와 같다.
\D : 숫자가 아닌 문자와 매치된다.
\s : 공백(스페이스, 탭, 개행 문자 등)과 매치된다.
\S : 공백이 아닌 문자와 매치된다.
\b : 단어 경계, 단어의 시작 또는 끝에 뒤에 나올 문자가 있어야 한다.
\B : 단어의 경계가 아닌 위치에 뒤에 나올 문자가 있어야 한다. 예제 참고


🆗 Python ReGex 실습

이번에는 바로 실습을 들어가는 것이 훨씬 도움이 될 것으로 생각된다. 예제 문제들을 하나씩 보면서 감을 익혀보자

문제를 풀기 위한 기본 코드는 다음과 같다.

# Solution
def text_match(text):
        patterns = '여기에 들어갈 패턴을 작성하자'
        if re.search(patterns,  text):
                return 'Found a match!'
        else:
                return('Not matched!')

print(text_match("확인할 텍스트 입력해보자"))

그럼 바로 문제 시작! 메타 문자 확인부터

📖 영문자 a를 포함하며 a 뒤에 0개 이상의 b가 있는지 검사하라.

patterns = 'ab*'

📖 영문자 a를 포함하며 a 뒤에 하나 이상의 b가 있는지 검사하라.

patterns = 'ab+'

📖 영문자 a를 포함하며 a 뒤에 b가 0개 또는 1개 이어지는지 검사하라.

patterns = 'ab?'

📖 영문자 a 뒤에 3개의 b가 이어지는지 검사하라.

patterns = 'ab{3}'

📖 영문자 a 뒤에 2~3개의 b가 이어지는지 검사하라.

patterns = 'ab{2,3}'

📖 영문 소문자 문자열들이 언더바(_)로 이어져 있는지 검사하라.

patterns = '^[a-z]+_[a-z]+$'
# (대신 $ 땜시 맨 뒤도 소문자 문자열로 끝나야 한다.)

📖 대문자 하나에 소문자가 따라붙는 경우가 있는지 검사하라.

patterns = '[A-Z][a-z]+'

📖 문자열에 a가 있고, a 뒤에 문자들이 이어지다가, b로 끝나는지 검사하라.

patterns = 'a.+b$'

특수 시퀀스도 이제는 볼 수 있어야 한다.

📖 문자열 시작이 단어인지 검사하라.

patterns = '^[a-zA-Z]+' or '^\w+'

📖 문자열dl 단어로 끝나는지 검사하라.

patterns = '.*[a-zA-Z]+\S*$' or '\w+\S*$'
# 문장의 끝에 온점이 있을 수 있기 때문에 \S 사용

📖 z가 포함된 단어를 포함하는지 검사하라.

patterns = '\w*z\w*'

📖 z가 포함된 단어가 포함되어 있지만, 문자열의 끝 또는 마지막이 아닌 중간에 위치하는지 검사하라.

patterns = '\Bz\B'

📖 영문 대소문자, 숫자, 언더바만 포함하는지 검사하라.

patterns = '^\w+$'

📖 숫자 5로 시작하는지 검사하라.

patterns = '^5'

📖 문자열 끝이 숫자인지 검사하라.

patterns = '.*\d+$' or '.*[0-9]+$'

re 함수도 조금 공부해보자

📖 문자열에 포함된 1자리~3자리 숫자를 찾아라.

patterns = re.finditer(r"(\d{1,3})", "hi 12 hello 123")

📖 문자열에서 특정 문자열을 검색하고, 해당 문자열의 위치를 확인하기

pattern = 'fox'
text = 'The quick brown fox jumps over the lazy dog.'
match = re.search(pattern, text)
s = match.start()
e = match.end()
print('"%s" 는 "%s"의 %d 에서 %d 에 있음' % (match.re.pattern, match.string, s, e))

📖 IP주소에서 선행 0(불필요한 0)을 제거하라.

ip = 216.08.007
patterns = re.sub('\.[0]*', '.', ip)

📖 문자열에서 특정 검색어 모두 찾기

text = 'Python exercises, PHP exercises, C# exercises'
pattern = 'exercises'
for match in re.findall(pattern, text):
	print('Found "%s"' % match)

<에필로그>

당분간은 안까먹을듯 ㅋㅋㅋㅋㅋ
나중에 latex 문법도 공부하자 앗 그리고

https://www.w3schools.com/python/python_regex.asp

  • W3C Schools 튜토리얼을 통해 실습이 가능하다!

profile
천방지축 어리둥절 빙글빙글 돌아가는 내인생

0개의 댓글

관련 채용 정보