파이썬 문자열에서 특정 문자 개수와 위치 찾기

파이썬 문자열에서 특정 문자 개수와 위치 찾기

문자열에서 특정 문자가 몇 번 등장하는지는 count()로, 어디에 등장하는지는 enumerate()로 찾을 수 있습니다. 대소문자와 빈 검색어 같은 경계 조건도 결과에 영향을 줍니다.

개수만 필요하면 count

text = "banana"
count = text.count("a")
print(count)  # 3

count()는 원본 문자열을 바꾸지 않고 겹치지 않는 등장 횟수를 반환합니다. 문자열 일부도 검색할 수 있습니다.

print("aaaa".count("aa"))  # 2

겹치는 모든 위치를 세려면 별도 로직이 필요합니다.

문자의 위치 모두 찾기

text = "banana"
target = "a"

positions = [
    index
    for index, char in enumerate(text)
    if char == target
]
print(positions)  # [1, 3, 5]

파이썬 인덱스는 0부터 시작합니다. 사용자에게 첫 번째 글자를 1번으로 보여 주려면 index + 1을 출력하십시오.

대소문자를 무시한 검색

text = "Kiwi and KIWI"
target = "kiwi"

count = text.casefold().count(target.casefold())
print(count)  # 2

표시용 원본은 그대로 보관하고 비교용 문자열만 변환하는 편이 좋습니다.

여러 문자 중 하나만 골라내기

text = "a1-b2_c3"
digits = "".join(char for char in text if char.isdigit())
letters = "".join(char for char in text if char.isalpha())

print(digits)   # 123
print(letters)  # abc

isdigit()isalpha()는 유니코드 문자를 포함해 판단합니다. ASCII 숫자만 허용해야 한다면 요구사항에 맞는 검사가 필요합니다.

빈 검색어 주의

print("abc".count(""))  # 4

빈 문자열은 문자 사이의 경계에도 존재한다고 계산되므로 예상보다 큰 값이 나옵니다. 사용자에게 검색 문자를 입력받는다면 빈 값부터 거부하십시오.

target = input("찾을 문자: ")
if len(target) != 1:
    print("문자 하나만 입력해 주세요.")

겹치는 문자열의 위치 찾기

"aaaa"에서 "aa"는 시작 위치 0, 1, 2에서 겹쳐 나타납니다. count()는 겹치지 않는 결과만 세므로 위치 순회가 필요합니다.

text = "aaaa"
target = "aa"
positions = [
    i for i in range(len(text) - len(target) + 1)
    if text.startswith(target, i)
]
print(positions)  # [0, 1, 2]

검색 대상이 빈 문자열이면 범위의 의미가 달라지므로 먼저 거부해야 합니다.

연습: 모음 개수 세기

영문 문장에서 a, e, i, o, u가 각각 몇 번 나오는지 딕셔너리로 계산해 보십시오. 대소문자를 무시하고 공백과 문장 부호는 제외합니다. 전체 모음 수와 가장 많이 나온 모음도 출력하세요.

find와 index의 실패 방식 비교

text = "banana"

print(text.find("z"))  # -1
print(text.index("a")) # 1

find()는 대상이 없으면 -1을 반환하고 index()ValueError를 발생시킵니다. “없음”이 정상 상황이라면 find()in이 편하고, 반드시 있어야 하는 데이터라면 예외가 오류를 빨리 드러낼 수 있습니다. -1도 유효한 파이썬 인덱스이므로 find() 결과를 검사하지 않고 바로 인덱싱하면 마지막 문자를 잘못 선택할 수 있습니다.

정리

횟수는 count(), 위치는 enumerate(), 조건에 맞는 문자 추출은 컴프리헨션과 join()이 적합합니다. 대소문자 처리와 빈 검색어 규칙을 먼저 정하면 예외적인 결과를 피할 수 있습니다.