본문 바로가기

개발/정규표현식

[정규 표현식] 문자 집합으로 찾기

반응형
글을 읽기 전에 아래 문제를 먼저 풀어보자 :)

문제

1. 정규 표현식에서 대괄호([])의 의미에 대해서 설명하여라.

더보기
대괄호는 문자 집합을 정의하는데 그 집합 요소 중 한 문자라도 일치해야 한다(OR)

2. 정규 표현식에서 하이픈(-)의 의미에 대해서 설명하여라.

더보기
하이픈은 대괄호 내에서, 범위를 설정하는데 사용된다.

3. 정규 표현식에서 캐럿(-)의 의미에 대해서 설명하여라.

더보기
캐럿은 지정한 문자들을 제외한 어떤 것들을 일치시키기 위해 사용된다.

4. 다음 문자열에서, 위의 1,2,3 번을 활용하여서, 맨 앞글자가 대문자 인 것을 제외 시켜보아라

Kwor.py
a1cw.py
ka1e.py
Ou23.py


더보기
In [82]: import re

In [83]: example_list = ["Kwor.py", "a1cw.py", "ka1e.py", "Ou23.py"]

In [84]: example_string = '\n'.join(example_list)

In [85]: result = re.findall('[^A-Z][0-9a-z][0-9a-z][0-9a-z]\.py', example_string)

In [86]: print(result)
['a1cw.py', 'ka1e.py']​


 

 

키워드

  • 대괄호([])
  • 하이픈(-)
  • 캐럿(^)

 

1. 여러 문자 중 하나와 일치시키기

아래와 같이 파이썬 파일이 주어 질 때, 맨앞글자가 n or s 이면서, 두번째 글자는 a 인 파일을 찾고 싶다면 어떻게 해야할까?

na1.py
sa2.py
ca1.py
abcde.py
In [10]: import re

In [11]: python_files = ["na1.py", "sa2.py", "ca1.py", "abcde.py"]

In [12]: python_files_string = '\n'.join(python_files)

In [13]: result = re.findall('[ns]a.\.py', python_files_string)

In [14]: print(result)
['na1.py', 'sa2.py']

정답은 '[ns]a.\.py' 이와 같이 써준다. 대괄호([])는 문자 집합을 표현하는데 사용된다. 대괄호 사이에 정의된 문자 중 하나가 일치하게 된다.

예를 들어서, [abcde] 가 있다면, a or b or c or d or e 라고 볼 수 있다.

이 문자 집합(대괄호) 는 아래와 같은 경우에 사용된다.

1. 대소문자를 구별하지 않고 검색하거나
2. 검색할 부분의 특정 영역만 대소문자를 구별하지 않을 때

예제는 다음과 같다.

In [19]: sentences = 'The phrase "regular expression" is oftenabbreviated as RegEx or regex.'

In [20]: result = re.findall('[Rr]eg[Ee]x', sentences)

In [21]: print(result)
['RegEx', 'regex']

 

2. 문자 집합 범위 사용하기

알파벳 소문자 전 범위에 해당하는 집합을 만들고 싶다면 어떻게 하면 될까?

1. [abcdefg...xyz] <-- 1개씩 다적어준다.
2. [a-z] <-- 범위로 표현해준다.

위와 같이 일일이 집합 요소를 다적어주기 힘들다면, 2번과 같이 범위로도 표현이 가능하다. 여기서 사용되는 하이픈(-) 은 대괄호 안에서만 메타문자의 역할을 한다.

 

3. '제외하고' 찾기

제외하고 싶은 것이 있다면, 캐럿(^)을 사용해 준다. - exclude 의 역할

아래와 같은 파일이 주어지고, 여기서 억지로.. abc.py 를 추출하고 싶다면?

na1.py
sa2.py
ca1.py
abc.py
us3.py
In [32]: import re

In [42]: python_files = ["na1.py", "sa2.py", "ca1.py", "abc.py", "us3.py"]

In [43]: python_files_string = '\n'.join(python_files)

In [44]: result = re.findall('[nscau].[^0-9]\.py', python_files_string)

In [45]: print(result)
['abc.py']

이렇게 써볼 수 있을 것 같다

[nscau]. <-- 여기 까지는 모든 조건이 만족하지만, 결정적으로 [^0-9]에서 다른 조건들이 모두 숫자를 포함하기 때문에 전부 걸러진다.

여기서 [^0-9] 는 집합 내에 있는 0-9 범위의 숫자는 제외하겠다는 뜻이다.

반응형

'개발 > 정규표현식' 카테고리의 다른 글

[정규 표현식] 문자 하나 찾기  (0) 2021.01.05
[정규 표현식] 정규 표현식 소개  (0) 2021.01.05