본문 바로가기
코딩테스트-파이썬

python 코테관련 정리 -문자열-

by 시니성 2023. 7. 22.

* str.upper(), str.lower()

대문자 소문자로 변환한 값을 반환한다.

text = "Hello, World!"

upper_text = text.upper()  # 모든 문자를 대문자로 변환
lower_text = text.lower()  # 모든 문자를 소문자로 변환

print(upper_text)  # 출력: "HELLO, WORLD!"
print(lower_text)  # 출력: "hello, world!"

 

* swapcase() : string의 대소문자를 바꿔줍니다

print(input().swapcase())

 

* print시 r옵션

r은 raw를 의미하여 예약어를 이스케이핑 해줍니다.

regex 에서 pattern 설정 시 escape 문자를 많이 써야해서 자주 사용합니다.

print(r'!@#$%^&*(\'"<>?:;')

*split(str separator, int maxSplit)

split()는 separator를 기반으로 분리된 list를 반환합니다.

매개변수를 아무것도 넣지 않으면 중복된 공백을 자동으로 처리하여 분리해 줍니다.

# 기본적인 사용
text = "apple,banana,grape,orange"
fruits = text.split(',')
print(fruits)  # 출력: ['apple', 'banana', 'grape', 'orange']

# 공백을 기준으로 분리
sentence = "Hello, how are you today?"
words = sentence.split()
print(words)  # 출력: ['Hello,', 'how', 'are', 'you', 'today?']

# maxsplit 매개변수 사용
text = "apple,banana,grape,orange"
fruits = text.split(',', maxsplit=2)
print(fruits)  # 출력: ['apple', 'banana', 'grape,orange']

 

*strip()

strip()은 문자열의 양쪽 끝에 있는 공백 문자(스페이스, 탭, 개행 등)을 제거하는 파이썬의 문자열 메소드입니다. 이를 통해 문자열의 불필요한 공백을 제거하거나 문자열을 깔끔하게 정리할 수 있습니다.

인자를 입력하면 해당 문자를 좌 우에서 제거해 줍니다.왼쪽, 오른쪽만 따로 적용시킬떄에는 lstrip()과 rstrip()을 사용할 수 있습니다.

print(input().strip().replace(' ', ''))
# lstrip() 예시
my_string = "   Hello, world!"
result_lstrip = my_string.lstrip()
print(result_lstrip)  # 출력: "Hello, world!"

# rstrip() 예시
my_string = "Hello, world!   "
result_rstrip = my_string.rstrip()
print(result_rstrip)  # 출력: "Hello, world!"

# lstrip()과 rstrip() 조합 예시
my_string = "   Hello, world!   "
result_combined = my_string.lstrip().rstrip()
print(result_combined)  # 출력: "Hello, world!"

*replace(string,string)

첫번째 인자를 두번째 인자로 치환합니다.

print(input().strip().replace(' ', ''))

* str.startswith(str prefix) 와 str.endswith(str suffix)

접두사와 접미사가 맞는지 bool타입을 반환합니다.

def check_prefix(my_string, prefix):
    return my_string.startswith(prefix)

# 예시
my_string = "Hello, World!"
prefix1 = "Hello"
prefix2 = "Hi"
print(check_prefix(my_string, prefix1))  # 출력: True
print(check_prefix(my_string, prefix2))  # 출력: False
def check_suffix(my_string, suffix):
    return my_string.endswith(suffix)

# 예시
my_string = "Hello, World!"
suffix1 = "World!"
suffix2 = "Hi"
print(check_suffix(my_string, suffix1))  # 출력: True
print(check_suffix(my_string, suffix2))  # 출력: False

* ord(char)

문자의 유니코드 숫자 값을 반환한다.

65 : A

71 : a

def get_unicode_code_point(char):
    return ord(char)

# 예시
char1 = 'A'
char2 = '가'
print(get_unicode_code_point(char1))  # 출력: 65
print(get_unicode_code_point(char2))  # 출력: 44032

* .translate(), str.maketrans()

  1. str.translate(table):
    • translate 메서드는 문자열 내부의 각 문자를 다른 문자로 변환하는 데 사용됩니다.
    • table은 변환 테이블을 나타내는 매개변수로, str.maketrans() 메서드를 통해 생성할 수 있습니다.
    • 변환 테이블에 있는 각 문자의 위치는 해당 문자의 유니코드 값에 대응됩니다.
    • 문자열 내의 각 문자는 변환 테이블에서 해당 문자의 유니코드 값의 위치를 찾아 대응되는 문자로 변환됩니다.
  2. str.maketrans(x, y, z=None):
    • maketrans 메서드는 문자열을 변환하기 위한 테이블을 생성하는 데 사용됩니다.
    • 세 개의 문자열 x, y, z를 인자로 받습니다. x와 y는 길이가 같아야 하며, z는 삭제될 문자를 나타내는 옵션 매개변수입니다.
    • maketrans 메서드는 변환 테이블을 생성하여 반환합니다.

아래는 translate와 maketrans를 사용한 예시 코드와 주석 설명입니다:

# 문자열을 특정 문자로 변환하기
def example_translate():
    my_string = "hello"
    translation_table = str.maketrans('helo', '1234')  # 'h' -> '1', 'e' -> '2', 'l' -> '3', 'o' -> '4'
    translated_string = my_string.translate(translation_table)
    print(translated_string)  # 출력: '32114'

# 문자열에서 특정 문자 삭제하기
def example_remove_characters():
    my_string = "apple"
    translation_table = str.maketrans('', '', 'ae')  # 'a'와 'e' 삭제
    removed_string = my_string.translate(translation_table)
    print(removed_string)  # 출력: 'ppl'

# translate와 maketrans를 한 줄로 사용하기
def example_one_liner():
    my_string = "hello"
    translated_string = my_string.translate(str.maketrans('helo', '1234'))
    print(translated_string)  # 출력: '32114'

# solution 함수 예제
def solution(myString):
    return myString.translate(str.maketrans('abcdefghijk', 'lllllllllll'))

 

* str.isdigit()

`.isdigit()` 메서드는 문자열이 모두 숫자로 구성되어 있는지 확인하는 파이썬의 문자열 메서드입니다. 이 메서드를 호출하면 문자열이 다음과 같은 조건을 만족하는지 여부를 판별합니다:

1. 문자열의 모든 문자가 0에서 9 사이의 숫자 문자일 때에만 `True`를 반환합니다.
2. 즉, 문자열이 하나 이상의 문자를 포함하고 있어야 합니다. 빈 문자열은 `False`를 반환합니다.

`.isdigit()` 메서드는 주로 입력값이 숫자인지 아닌지를 확인할 때 사용합니다.

예를 들어 아래의 예시에서 `isdigit()` 메서드는 각각의 문자열에 대해 숫자인지 아닌지를 판별하여 해당하는 결과를 반환합니다. `'12345'`는 모두 숫자이므로 `True`를 반환하고, `'12 34'`는 공백이 포함되어 있기 때문에 `False`를 반환합니다. `'Hello'`는 알파벳 문자를 포함하고 있기 때문에 `False`를 반환하며, 빈 문자열 `""`도 문자가 없으므로 `False`를 반환합니다.

# 숫자로만 구성된 문자열
number_str = "12345"
result1 = number_str.isdigit()
print(result1)  # 출력: True

# 공백이 포함된 문자열
space_str = "12 34"
result2 = space_str.isdigit()
print(result2)  # 출력: False

# 알파벳 문자열
alpha_str = "Hello"
result3 = alpha_str.isdigit()
print(result3)  # 출력: False

# 빈 문자열
empty_str = ""
result4 = empty_str.isdigit()
print(result4)  # 출력: False

* re 모듈을 사용한 정규식

파이썬의 re 모듈은 정규식(RegEx, Regular Expression)를 사용하여 문자열을 처리할 수 있는 강력한 도구입니다. 여기에는 여러 가지 메타 문자, 시퀀스 및 특수 시퀀스가 포함되어 있습니다.

1. **메타 문자**: 이 문자들은 특별한 의미를 가지며, 이들을 조합하여 복잡한 검색 패턴을 만들 수 있습니다. 
   - `.` : 개행문자를 제외한 모든 문자와 일치
   - `^` : 문자열의 시작과 일치
   - `$` : 문자열의 끝과 일치
   - `*` : 이전 문자가 0번 이상 반복되는 패턴과 일치
   - `+` : 이전 문자가 1번 이상 반복되는 패턴과 일치
   - `?` : 이전 문자가 0번 또는 1번 반복되는 패턴과 일치
   - `{}` : 이전 문자가 특정 수의 반복을 가지는 패턴과 일치
   - `[]` : 문자 집합을 나타냅니다. 예를 들어, `[abc]`는 'a', 'b', 'c' 중 하나와 일치합니다.
   - `|` : OR 조건을 의미, `a|b`는 'a' 또는 'b'와 일치
   - `()` : 그룹을 만들고 그룹화된 부분에 대해 메타 문자를 적용
   - `\` : 특수 문자의 실제 의미를 나타내거나 특수 시퀀스를 나타냅니다.

2. **특수 시퀀스**: 이 시퀀스들은 `\` 문자로 시작하며 특별한 의미를 가지고 있습니다.
   - `\d` : 모든 숫자와 일치 ([0-9]와 동일)
   - `\D` : 숫자가 아닌 모든 문자와 일치
   - `\s` : 모든 공백 문자(공백, 탭, 줄 바꿈 등)와 일치
   - `\S` : 공백 문자가 아닌 모든 문자와 일치
   - `\w` : 모든 문자, 숫자 및 밑줄 문자와 일치 ([a-zA-Z0-9_]와 동일)
   - `\W` : 문자, 숫자, 밑줄이 아닌 모든 문자와 일치
   - `\b` : 단어의 시작 또는 끝을 나타내는 단어 경계
   - `\B` : 단어 경계가 아닌 위치
   - `\\` : 실제 역 슬래시 문자와 일치

3. **메소드**:
   - `re.match()` : 문자열의 시작 부분이 정규식과 일치하는지 확인
   - `re.search()` : 문자열 전체에서 정규식과 일치하는 부분이 있는지 확인
   - `re.findall()` : 정규식과 일치하는 모든 부분을 리스트로 반환
   - `re.sub()` : 정규식과 일치하는 부분을 다른 문자열로 치환
   - `re.split()` : 정규식에 일치하는 부분에서 문자열을 분할

이를 활용하여 다양한 문자열 처리 작업을 할 수 있습니다. 위의 정규식을 사용하여 특정 문자열 패턴을 찾거나 치환하는 등의 작업을 수행할 수 있습니다.

 

*r"str", raw string

`r`은 Python에서 raw string을 의미합니다. 일반적인 문자열에서는 역 슬래시`\`를 특수 문자의 escape 문자로 사용합니다. 예를 들어, `\n`은 줄바꿈을, `\t`는 탭을 나타내는 등입니다.

그러나 정규 표현식에서는 역 슬래시`\`가 메타 문자를 이스케이프하는데 사용됩니다. 예를 들어, `\d`는 모든 숫자를 의미하고, `\\`는 역슬래시 자체를 나타냅니다. 

따라서, 정규 표현식 문자열에서 역 슬래시를 이용하려면 두 번 사용해야 합니다. 예를 들어, 모든 숫자를 찾으려면 `"\\d"`와 같이 작성해야 합니다. 이는 가독성을 떨어뜨리고 실수를 유발할 수 있습니다.

그래서 Python에서는 raw string 표기법인 `r`을 제공합니다. 이를 사용하면 역 슬래시를 한 번만 써도 그대로 역 슬래시로 인식합니다. 따라서 `"\\d"` 대신 `r"\d"`로 작성할 수 있습니다.

요약하면, `r`을 사용하면 역 슬래시를 두 번 쓰지 않고도 문자열 내의 역 슬래시를 그대로 해석할 수 있어, 정규 표현식을 더 쉽게 작성할 수 있습니다.

 

import re

def solution(my_string):
    return sum([int(i) for i in re.findall(r'[0-9]+', my_string)])

`re`는 Python의 정규 표현식(regular expression) 모듈입니다. 정규 표현식은 문자열에서 특정한 패턴을 찾거나 매칭하는 데 사용되는 강력한 도구로, 특정한 규칙을 따르는 문자열을 효율적으로 검색, 추출, 치환할 수 있습니다.

`r'[0-9]+'`는 하나 이상의 숫자(0부터 9까지의 숫자)가 연속적으로 나타나는 패턴을 나타냅니다. 각 부분에 대해 자세히 설명하면 다음과 같습니다:

- `r`: `r`은 Python에서 사용되는 Raw String Literal의 접두사로, 문자열 안에 있는 이스케이프(Escape) 문자를 해석하지 않고 그대로 사용하도록 합니다. 정규 표현식에서 Raw String Literal을 사용하면 백슬래시(`\`)를 이스케이프하지 않고도 패턴을 표현할 수 있습니다.

- `[0-9]`: `[ ]`는 문자 클래스(character class)를 나타내며, 여기서는 0부터 9까지의 숫자 중 하나를 의미합니다. 따라서 `[0-9]`는 하나의 숫자에 매칭됩니다.

- `+`: `+`는 앞의 패턴이 하나 이상 반복됨을 의미합니다. 즉, `[0-9]+`는 하나 이상의 숫자가 연속적으로 나타나는 패턴을 의미합니다. 따라서 "123", "4567"과 같은 숫자에 매칭되지만, "abc"와 같은 문자열에는 매칭되지 않습니다.

따라서, `re.findall(r'[0-9]+', my_string)`는 입력된 `my_string`에서 숫자들의 연속을 찾아서 리스트로 반환하는 역할을 합니다. 그리고 그 반환된 숫자들을 `int(i)`를 통해 정수로 변환한 후, `sum` 함수를 이용하여 모든 숫자들의 합을 구한 뒤, 이 값을 최종적으로 함수의 반환값으로 돌려줍니다.

import re

def extract_emails(text):
    pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
    emails = re.findall(pattern, text, re.IGNORECASE)
    return emails

# 테스트
sample_text = "이것은 example123@gmail.com과 test_456@example.co.kr의 예시 이메일 주소입니다."
result = extract_emails(sample_text)
print(result)  # 출력: ['example123@gmail.com', 'test_456@example.co.kr']


위 코드에서 사용된 정규 표현식 패턴 `r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'`는 다음과 같은 의미를 가집니다:

- `\b`: 단어 경계를 나타냅니다. 이를 사용함으로써 이메일 주소가 다른 문자와 붙어있는 경우를 방지합니다.

- `[A-Za-z0-9._%+-]+`: 이메일 주소의 로컬 파트로 사용될 수 있는 문자들을 허용합니다. `+`는 앞의 패턴이 하나 이상 반복됨을 의미합니다.

- `@`: 이메일 주소에서 '@' 문자를 나타냅니다.

- `[A-Za-z0-9.-]+`: 이메일 주소의 도메인 파트로 사용될 수 있는 문자들을 허용합니다.

- `\.`: 점(.) 문자를 이스케이프하여 문자 그대로를 나타냅니다.

- `[A-Z|a-z]{2,}`: 최소 2개 이상의 대문자 또는 소문자 알파벳으로 이루어진 최상위 도메인을 나타냅니다. `{2,}`는 최소 2개 이상 반복됨을 의미합니다.

위 패턴에 부합하는 이메일 주소를 `re.findall` 함수를 통해 추출하고, 결과를 리스트로 반환합니다. 출력 결과로는 입력 텍스트에 포함된 모든 이메일 주소가 추출되어 나올 것입니다.

 

728x90