파이썬 문자열에서 특정 문자 개수와 위치 찾기
파이썬 문자열에서 특정 문자 개수와 위치 찾기
문자열에서 특정 문자가 몇 번 등장하는지는 count()로, 어디에 등장하는지는 enumerate()로 찾을 수 있습니다. 대소문자와 빈 검색어 같은 경계 조건도 결과에 영향을 줍니다.
개수만 필요하면 count
text = "banana"
count = text.count("a")
print(count) # 3count()는 원본 문자열을 바꾸지 않고 겹치지 않는 등장 횟수를 반환합니다. 문자열 일부도 검색할 수 있습니다.
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) # abcisdigit()과 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")) # 1find()는 대상이 없으면 -1을 반환하고 index()는 ValueError를 발생시킵니다. “없음”이 정상 상황이라면 find()나 in이 편하고, 반드시 있어야 하는 데이터라면 예외가 오류를 빨리 드러낼 수 있습니다. -1도 유효한 파이썬 인덱스이므로 find() 결과를 검사하지 않고 바로 인덱싱하면 마지막 문자를 잘못 선택할 수 있습니다.
정리
횟수는 count(), 위치는 enumerate(), 조건에 맞는 문자 추출은 컴프리헨션과 join()이 적합합니다. 대소문자 처리와 빈 검색어 규칙을 먼저 정하면 예외적인 결과를 피할 수 있습니다.