def bf_match(txt: str, pat: str) -> int:
"""브루트 포스법으로 문자열 검색"""
pt = 0 # txt(텍스트)를 따라가는 커서
pp = 0 # pat(패턴)를 따라가는 커서
while pt != len(txt) and pp != len(pat):
if txt[pt] == pat[pp]:
pt += 1
pp += 1
else:
pt = pt - pp + 1
pp = 0
return pt - pp if pp == len(pat) else -1
str.find(sub[, start[, end]])
포함되면 가장 작은 인덱스 반환, 아니면 -1 반환 start, end 생략 가능 슬라이스 표기에 따라 지정str.rfind(sub[, start[, end]])
포함되면 가장 큰 인덱스 반환, 아니면 -1 반환 start, end 생략 가능 슬라이스 표기에 따라 지정str.index(sub[, start[, end]])
포함되면 가장 작 인덱스 반환, 아니면 에러 start, end 생략 가능 슬라이스 표기에 따라 지정str.rindex(sub[, start[, end]])
포함되면 가장 큰 인덱스 반환, 아니면 에러 start, end 생략 가능 슬라이스 표기에 따라 지정str.startswith(sub[, start[, end]])
문자열이 sub로 시작하면 True, 아니면 Falsestr.endswith(sub[, start[, end]])
문자열이 sub로 끝나면 True, 아니면 Falsedef kmp_match(txt: str, pat: str) -> int:
"""KMP법에 의한 문자열 검색"""
pt = 1 # txt를 따라가는 커서
pp = 0 # pat를 따라가는 커서
skip = [0] * (len(pat) + 1) # 건너뛰기 표
# 건너뛰기 표 만들기
skip[pt] = 0
while pt != len(pat):
if pat[pt] == pat[pp]:
pt += 1
pp += 1
skip[pt] = pp
elif pp == 0:
pt += 1
skip[pt] = pp
else:
pp = skip[pp]
# 검색하기
pt = pp = 0
while pt != len(txt) and pp != len(pat):
if txt[pt] == pat[pp]:
pt += 1
pp += 1
elif pp == 0:
pt += 1
else:
pp = skip[pp]
return pt - pp if pp == len(pat) else -1
def bm_match(txt, pat):
skip = [None] * 256 # 건너뛰기 표
# 건너뛰기 표 만들기
for pt in range(256):
skip[pt] = len(pat)
for pt in range(len(pat)):
skip[ord(pat[pt])] = len(pat) - pt - 1
# 검색하기
while pt < len(txt):
pp = len(pat) - 1
while txt[pt] == pat[pp]:
if pp == 0:
return pt
pt -= 1
pp -= 1
pt += skip[ord(txt[pt])] if skip[ord(txt[pt])] > len(pat) - pp \
else len(pat) - pp
return -1
일반적으로 파이썬에서 문자열을 검색한다면 표준 라이브러리를 사용하는 것이 좋다.