정규 표현식(regex)을 사용하여 정확히 반복되는 토큰 수만큼 전체 줄과 일치시키는 방법

2024-07-27

기본 개념

1 토큰

토큰은 정규 표현식에서 문자열의 기본 단위입니다. 토큰은 문자, 숫자, 특수 문자 또는 문자 그룹일 수 있습니다. 예를 들어, 다음 정규 표현식에서 토큰은 다음과 같습니다.

a.b
  • a: 문자 a
  • .: 임의의 문자

2 반복

정규 표현식에서 토큰을 반복하려면 +, * 또는 ? 연산자를 사용합니다.

  • +: 토큰이 1번 이상 반복되어야 합니다.

예를 들어, 다음 정규 표현식은 a가 1번 이상 반복된 모든 문자열과 일치합니다.

a+

3 Lookaround

Lookaround는 정규 표현식이 일치하는 위치를 제한하는 데 사용됩니다. 긍정적 lookaround ((?=...))는 특정 패턴이 현재 위치 바로 뒤에 있어야 일치하는 것을 확인합니다. 부정적 lookaround ((?!...))는 특정 패턴이 현재 위치 바로 뒤에 없어야 일치하는 것을 확인합니다.

a(?=b)

정확히 반복되는 토큰 수만큼 전체 줄과 일치시키기

다음은 정확히 n번 반복되는 토큰 x만큼 전체 줄과 일치시키는 정규 표현식입니다.

^x{n}$
  • ^: 문자열의 시작과 일치
  • x{n}: 토큰 xn번 반복
^a{3}$

1 예시

다음은 정규 표현식 ^x{n}$을 사용하는 몇 가지 예시입니다.

lookaround를 사용하여 줄의 시작과 끝을 확인하기

^$ 연산자는 문자열의 시작과 끝을 확인하는 데 유용하지만, 특정 토큰이 줄의 시작 또는 끝에 있는지 확인하는 데는 사용할 수 없습니다. 이 경우 lookaround를 사용해야 합니다.

(?m)^x{n}$
  • (?m): 멀티라인 모드 활성화. 각 줄을 개별적으로 처리합니다.
  • 입력:
aaa
bbb
aaaaa
  • 결과: 첫 번째 줄과 세 번째 줄만 일



예제 코드

import re

def match_line(line, pattern):
  """
  정규 표현식 패턴과 일치하는지 확인합니다.

  Args:
    line: 문자열
    pattern: 정규 표현식 패턴

  Returns:
    True if the line matches the pattern, False otherwise.
  """
  return re.match(pattern, line)

# 테스트 코드
lines = [
  "aaa",
  "abca",
  "aaaaa",
  "aaa\nbbb\naaaaa",
]

pattern = "^a{3}$"

for line in lines:
  print(f"Line: {line}")
  print(f"Match: {match_line(line, pattern)}")
  print()

출력:

Line: aaa
Match: True

Line: abca
Match: False

Line: aaaaa
Match: False

Line: aaa
bbb
aaaaa
Match: True
Match: False
Match: True

추가 정보




정확히 반복되는 토큰 수만큼 전체 줄과 일치시키는 대체 방법

문자열 슬라이싱

다음은 Python에서 문자열 슬라이싱을 사용하여 정확히 3번 반복되는 문자 a만큼 전체 줄과 일치시키는 코드입니다.

def match_line(line):
  """
  정확히 3번 반복되는 문자 'a'만큼 전체 줄과 일치하는지 확인합니다.

  Args:
    line: 문자열

  Returns:
    True if the line matches the pattern, False otherwise.
  """
  return line == "aaa"

# 테스트 코드
lines = [
  "aaa",
  "abca",
  "aaaaa",
]

for line in lines:
  print(f"Line: {line}")
  print(f"Match: {match_line(line)}")
  print()
Line: aaa
Match: True

Line: abca
Match: False

Line: aaaaa
Match: False

for 루프

def match_line(line, x, n):
  """
  정확히 n번 반복되는 토큰 'x'만큼 전체 줄과 일치하는지 확인합니다.

  Args:
    line: 문자열
    x: 토큰
    n: 반복 횟수

  Returns:
    True if the line matches the pattern, False otherwise.
  """
  if len(line) != n * len(x):
    return False

  for i in range(n):
    if line[i * len(x)] != x:
      return False

  return True

# 테스트 코드
lines = [
  "aaa",
  "abca",
  "aaaaa",
]

x = "a"
n = 3

for line in lines:
  print(f"Line: {line}")
  print(f"Match: {match_line(line, x, n)}")
  print()
Line: aaa
Match: True

Line: abca
Match: False

Line: aaaaa
Match: False

장단점 비교

방법장점단점
정규 표현식간결하고 읽기 쉽습니다.복잡한 패턴을 처리하기 어려울 수 있습니다.
문자열 슬라이싱간단하고 직관적입니다.문자열의 길이가 변동될 경우 코드를 수정해야 합니다.
for 루프모든 경우에 적용할 수 있습니다.코드가 다소 복잡해질 수 있습니다.

결론


regex regex-lookarounds

regex lookarounds

정규 표현식을 사용한 전화번호 유효성 검사

1. 전화번호 형식전화번호 형식은 국가마다 다릅니다. 하지만, 일반적으로 다음과 같은 요소들을 포함합니다.국가 코드: 국가를 식별하는 숫자입니다. 예를 들어, 미국은 +1, 한국은 +82입니다.지역 코드: 특정 지역을 식별하는 숫자입니다


정규 표현식을 이용한 이메일 주소 유효성 검사

정규 표현식(Regular Expression, 줄여서 Regex)은 문자열 검색과 조작을 위한 강력한 도구입니다. 특정 패턴을 정의하여 문자열 내에서 원하는 부분을 찾아내거나, 문자열의 형식이 올바른지 검증하는 데 사용됩니다


정규 표현식으로 특정 단어를 포함하지 않는 줄 찾기: regex, regex-negation

정규 표현식(Regular Expression, 줄여서 regex)은 문자열 패턴을 표현하는 데 사용되는 특수한 문자열입니다. 텍스트 데이터에서 특정 패턴을 검색하거나, 문자열을 조작하는 등 다양한 작업에 활용됩니다