HOWTO · Python
Python 문자열에서 문자의 모든 인덱스 찾기
정규 표현식, yield 키워드 및 목록 이해를 사용하여 Python에서 문자열 내부의 모든 문자 인덱스를 찾을 수 있습니다.
이 페이지의 내용
Python 문자열에서 문자가 나타나는 모든 위치를 찾으려면 enumerate()와 조건식을 함께 사용해 일치하는 인덱스를 모으면 됩니다. Python 인덱스는 0부터 시작하므로 첫 문자의 인덱스는 0입니다. 아래 예제에서는 문자열 "This is a string"에서 소문자 "i"를 찾습니다.
enumerate()와 리스트 컴프리헨션으로 문자의 모든 인덱스 찾기
문자열과 대상 문자를 주면 이 리스트 컴프리헨션은 일치하는 인덱스를 순서대로 모두 반환합니다. 다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
string = "This is a string"
char = "i"
indices = [index for index, character in enumerate(string) if character == char]
print(indices)
enumerate(string)은 각 문자에 대해 인덱스와 문자 값으로 이루어진 쌍을 제공합니다. 조건식은 문자 값이 char와 같을 때만 해당 인덱스를 남기고, 리스트 컴프리헨션은 그 인덱스들을 새 리스트에 모읍니다. 예제 입력에서 일치하는 위치는 2, 5, 13입니다. 대소문자를 구분하므로 "I"를 검색해도 소문자 "i"와 일치하지 않습니다. 대상 문자가 없으면 결과는 []입니다. 모든 인덱스를 한 번에 얻어야 할 때 대체로 가장 이해하기 쉬운 방법입니다.
yield로 일치하는 인덱스를 지연 생성하기
결과를 하나씩 처리하거나 입력이 클 때는 제너레이터가 유용합니다. 아래 함수는 리스트 컴프리헨션과 같은 비교와 순서를 사용하지만, 반복이 진행되면서 각 인덱스를 하나씩 생성합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
def find_indexes(string, char):
for index, character in enumerate(string):
if character == char:
yield index
string = "This is a string"
char = "i"
indices = list(find_indexes(string, char))
print(indices)
find_indexes(string, char)를 호출하면 제너레이터가 만들어지고, 값이 요청될 때 함수 본문이 실행됩니다. for 루프를 사용하면 각 인덱스를 차례로 처리할 수 있고, 전체 리스트가 필요하면 호출 결과를 list(...)로 감싸면 됩니다. 제너레이터를 리스트로 변환하면 리스트 컴프리헨션과 같은 인덱스를 얻습니다. 일치하는 문자가 없으면 반복에서 아무 값도 나오지 않으며 list(...)의 결과는 []입니다. yield 키워드는 호출자에게 값을 전달하는 동안 함수 실행을 멈췄다가 다음 반복에서 이어갑니다.
정규 표현식으로 문자의 모든 인덱스 찾기
이 글의 세 가지 방법 모두에서 char는 길이가 1인 Python 문자열이어야 합니다. 이 입력 조건을 공통으로 두면 문자별 비교와 정규 표현식 예제를 일관되게 사용할 수 있습니다. 검색 조건을 정규 표현식 패턴으로 표현하는 것이 자연스러울 때는 re.finditer()를 사용하세요. 각 일치 객체의 시작 위치는 start()로 얻을 수 있습니다. 데이터로 받은 문자를 문자 그대로 찾으려면 re.escape()를 거쳐 전달해야 합니다. 그렇지 않으면 ., *, [ 같은 문자가 문자 자체가 아니라 정규 표현식 문법으로 해석될 수 있습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import re
string = "This is a string"
char = "i"
pattern = re.escape(char)
indices = [match.start() for match in re.finditer(pattern, string)]
print(indices)
[2, 5, 13]
문자를 문자 그대로 찾을 때는 이스케이프해야 하며, 대상에 정규 표현식 메타문자가 들어갈 수 있다면 특히 중요합니다. 의도적으로 패턴을 검색하려면 그 패턴을 이스케이프하지 말고 re.finditer()에 직접 전달하세요. 문자 하나를 그대로 찾는 경우에는 enumerate()가 더 간단합니다. 정규 표현식은 검색 규칙에 패턴 기능이 필요할 때 가장 유용합니다. 세 방법 모두 왼쪽에서 오른쪽으로 검색하고, 반복해서 일치하는 항목도 유지하며, 0부터 시작하는 인덱스를 반환합니다.