Python 문자열

Python에는 'str'이라는 문자열 클래스가 내장되어 있으며 여러 가지 유용한 기능을 포함하고 있습니다. 'string'이라는 이전 모듈의 경우 사용하면 안 됩니다. 문자열 리터럴은 큰따옴표나 작은따옴표로 묶을 수 있지만 작은따옴표가 더 일반적으로 사용됩니다. 백슬래시 이스케이프는 작은따옴표와 큰따옴표에서 모두 일반적인 방식으로 작동합니다(예: \n \' \'). 큰따옴표로 묶은 문자열 리터럴에는 큰따옴표를 사용하지 않고 작은따옴표를 포함할 수 있습니다(예: 'I do't do it'). 마찬가지로 작은따옴표로 묶은 문자열에는 큰따옴표를 포함할 수 있습니다. 문자열 리터럴은 여러 줄에 걸쳐 있을 수 있지만 줄바꿈을 이스케이프 처리하려면 각 줄 끝에 백슬래시 \가 있어야 합니다. 삼중 따옴표 안에 있는 문자열 리터럴 """ 또는 '''은 여러 줄의 텍스트를 포함할 수 있습니다.

Python 문자열은 '변경 불가능'합니다. 즉, 생성된 후에는 변경할 수 없습니다 (Java 문자열도 이 변경 불가능한 스타일을 사용합니다). 문자열은 변경할 수 없으므로 계산된 값을 나타내기 위해 *새* 문자열을 생성합니다. 예를 들어 'hello' + 'there') 표현식은 'hello'와 'there' 두 문자열을 가져와 새 문자열 'hellothere'를 작성합니다.

문자열의 문자는 표준 [ ] 구문을 사용하여 액세스할 수 있으며 Java 및 C++와 마찬가지로 Python은 0 기반 색인 생성을 사용하므로 s가 'hello' s[1] 이면 'e'입니다. 색인이 문자열의 범위를 벗어나면 Python에서 오류가 발생합니다. Perl과 달리 Python 스타일은 단순히 기본값을 구성하는 것이 아니라 무엇을 해야 할지 알 수 없는 경우 중단하는 것입니다. 또한 아래의 'slice' 구문을 사용하면 문자열에서 하위 문자열을 추출할 수 있습니다. len(string) 함수는 문자열의 길이를 반환합니다. [ ] 구문과 len() 함수는 실제로 문자열, 목록 등 모든 시퀀스 유형에서 작동합니다. Python은 작업이 여러 유형에서 일관되게 작동하도록 합니다. Python 초보자 주의 사항: len() 함수가 차단되지 않도록 변수 이름으로 'len'을 사용하지 마세요. '+' 연산자는 두 문자열을 연결할 수 있습니다. 아래 코드에서 변수가 사전 선언되지 않은 것을 알 수 있습니다. 변수에 할당하기만 하면 됩니다.

  s = 'hi'
  print(s[1])          ## i
  print(len(s))        ## 2
  print(s + ' there')  ## hi there

Java와 달리 '+'는 숫자나 기타 유형을 문자열 형식으로 자동 변환하지 않습니다. str() 함수는 값을 문자열 형식으로 변환하므로 다른 문자열과 결합할 수 있습니다.

  pi = 3.14
  ##text = 'The value of pi is ' + pi      ## NO, does not work
  text = 'The value of pi is '  + str(pi)  ## yes

숫자의 경우 표준 연산자 +, /, * 는 일반적인 방식으로 작동합니다. ++ 연산자는 없지만 +=, -= 등은 작동합니다. 정수 나눗셈을 원하면 슬래시 2개를 사용하세요(예: 6 // 5 = 1).

'print' 함수는 일반적으로 하나 이상의 Python 항목을 출력한 다음 줄바꿈을 출력합니다. '원시' 문자열 리터럴은 'r'이 접두사로 붙고 백슬래시를 특별하게 처리하지 않고 모든 문자를 전달하므로 r'x\nx'는 길이가 4 문자열인 'x\nx'로 평가됩니다. 'print'는 모든 항목 출력을 완료한 후 더 이상 줄바꿈을 출력하지 않도록 'end'를 ''로 설정하는 것과 같이 여러 인수를 받아 출력 방법을 변경합니다 (python.org 인쇄 함수 정의 참고).

  raw = r'this\t\n and that'

  # this\t\n and that
  print(raw)

  multi = """It was the best of times.
  It was the worst of times."""

  # It was the best of times.
  #   It was the worst of times.
  print(multi)

문자열 메서드

다음은 가장 일반적인 문자열 메서드입니다. 메서드는 함수와 비슷하지만 객체에서 '실행'됩니다. 변수 s가 문자열이면 코드 s.lower()가 해당 문자열 객체에 하위() 메서드를 실행하고 결과를 반환합니다. 객체에서 실행되는 메서드라는 개념은 객체 지향 프로그래밍 (OOP)을 구성하는 기본 아이디어 중 하나입니다. 다음은 가장 일반적인 문자열 메서드입니다.

  • s.lower(), s.upper(): 문자열의 소문자 또는 대문자 버전을 반환합니다.
  • s.strip() -- 시작과 끝에서 공백이 삭제된 문자열을 반환
  • s.isalpha()/s.isfinger()/s.isspace()... -- 모든 문자열 문자가 다양한 문자 클래스에 속하는지 테스트합니다.
  • s.startswith('other'), s.endswith('other') -- 문자열이 지정된 다른 문자열로 시작하거나 끝나는지 테스트합니다.
  • s.find('other') -- s 내에서 지정된 다른 문자열 (정규 표현식이 아님)을 검색하여 해당 문자열이 시작하는 첫 번째 색인을 반환하거나 찾을 수 없는 경우 -1을 반환합니다.
  • s.replace('old', 'new') -- 'old'와 일치하는 모든 항목이 'new'로 대체된 문자열을 반환합니다.
  • s.split('delim') -- 지정된 구분 기호로 구분된 하위 문자열 목록을 반환합니다. 구분자는 정규 표현식이 아니라 텍스트일 뿐입니다. 'aaa,bbb,ccc'.split(',') -> ['aaa', 'bbb', 'ccc']. 편리한 특수 사례로, s.split()는 인수 없이 모든 공백 문자로 분할됩니다.
  • s.join(list) -- split()의 반대이며, 문자열을 구분자로 사용하여 지정된 목록의 요소를 함께 조인합니다. 예: '---'.join(['aaa', 'bbb', 'ccc']) -> aaa---bbb---ccc

Google에서 'python str'을 검색하면 모든 str 메서드가 나열된 공식 python.org 문자열 메서드로 연결됩니다.

Python에는 별도의 문자 유형이 없습니다. 대신 s[8] 과 같은 표현식은 해당 문자를 포함하는 문자열-길이-1을 반환합니다. 이 string-length-1에서는 연산자 ==, <=, ... 모두 예상한 대로 작동하므로 Python에 별도의 스칼라 'char' 유형이 없다는 사실을 알 필요가 없습니다.

스트링 슬라이스

'슬라이스' 문법은 시퀀스의 하위 부분(일반적으로 문자열과 목록)을 참조하는 편리한 방법입니다. 슬라이스 s[start:end] 는 시작부터 시작되어 끝부분까지 확장되는 요소입니다. s = 'Hello'가 있다고 가정합니다.

문자 색인이 0 1 2 3 4인 문자열 &#39;hello&#39;

  • s[1:4] 는 'ell'입니다. 색인 1부터 시작해 색인 4까지 확장되는 문자
  • s[1:] 은 'ello'입니다. 즉, 색인을 생략하면 기본적으로 문자열의 시작이나 끝이 됩니다.
  • s[:] 는 'Hello'입니다. 둘 다 생략하면 항상 전체의 사본이 제공됩니다. 이는 문자열이나 목록과 같은 시퀀스를 Python 방식으로 복사하는 방법입니다.
  • s[1:100] 은 'ello'입니다. 너무 큰 색인은 문자열 길이만큼 잘립니다.

0부터 시작하는 표준 색인 번호를 사용하면 문자열 시작 부분의 문자에 쉽게 액세스할 수 있습니다. 대신 Python은 음수를 사용하여 문자열 끝에 있는 문자에 쉽게 액세스할 수 있도록 합니다. s[-1] 은 마지막 문자 'o', s[-2] 는 'l' 다음에 오는 문자입니다. 음수 색인 번호는 문자열의 끝에서 다시 계산됩니다.

  • s[-1] 은 'o'입니다. 마지막 문자 (끝에서 첫 번째 문자)입니다.
  • s[-4] 는 'e'입니다. 끝에서 4번째입니다.
  • s[:-3] 은 'He'입니다. 마지막 3자까지 올라가지만 나머지 글자는 포함하지 않습니다.
  • s[-3:] 은 'llo'입니다. 끝에서 세 번째 문자로 시작하여 문자열 끝까지 이어집니다.

모든 색인 n, s[:n] + s[n:] == s의 슬라이스의 멋진 트루즘입니다. 이는 n 부정 또는 범위를 벗어난 경우에도 작동합니다. 즉, s[:n] 과 s[n:] 은 항상 문자열을 두 개의 문자열 부분으로 나누어 모든 문자를 보존합니다. 나중에 목록 섹션에서 확인하겠지만 슬라이스는 목록과도 함께 작동합니다.

문자열 형식 지정

Python이 할 수 있는 한 가지 멋진 일은 객체를 인쇄에 적합한 문자열로 자동 변환하는 것입니다. 이를 수행하는 두 가지 기본 제공 방법은 형식이 지정된 문자열 리터럴('f-문자열'이라고도 함)과 str.format() 호출입니다.

형식이 지정된 문자열 리터럴

다음과 같은 상황에서 형식이 지정된 문자열 리터럴이 사용되는 경우가 많습니다.

  value = 2.791514
  print(f'approximate value = {value:.2f}')  # approximate value = 2.79

  car = {'tires':4, 'doors':2}
  print(f'car = {car}') # car = {'tires': 4, 'doors': 2}

형식이 지정된 리터럴 문자열은 원시 문자열에 사용되는 'r' 접두사와 같이 'f'라는 접두사가 붙습니다. 중괄호 '{}' 밖에 있는 텍스트는 모두 직접 출력됩니다. '{}'에 포함된 표현식은 형식 사양에 설명된 형식 사양을 사용하여 출력됩니다.자르기, 과학적 표기법으로 변환, 왼쪽/오른쪽/중앙 정렬 등 형식 지정과 관련하여 할 수 있는 일들이 많습니다.

f-문자열은 객체의 표를 출력할 때 매우 유용하며 서로 다른 객체 속성을 나타내는 열을 다음과 같이 정렬하고자 할 때

  address_book = [{'name':'N.X.', 'addr':'15 Jones St', 'bonus': 70},
      {'name':'J.P.', 'addr':'1005 5th St', 'bonus': 400},
      {'name':'A.A.', 'addr':'200001 Bdwy', 'bonus': 5},]

  for person in address_book:
    print(f'{person["name"]:8} || {person["addr"]:20} || {person["bonus"]:>5}')

  # N.X.     || 15 Jones St          ||    70
  # J.P.     || 1005 5th St          ||   400
  # A.A.     || 200001 Bdwy          ||     5

문자열 %

Python에는 문자열을 조합하는 이전 printf()와 같은 기능도 있습니다. % 연산자는 왼쪽에 printf 유형 형식 문자열 (%d int, %s 문자열, %f/%g 부동 소수점)을 사용하고 오른쪽 튜플에서 일치하는 값을 사용합니다 (튜플은 일반적으로 괄호 안에 그룹화된 쉼표로 구분된 값으로 구성됨).

  # % operator
  text = "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down." % (3, 'huff', 'puff', 'house')

위의 줄은 약간 깁니다. 별도의 줄로 나누어야 한다고 가정해 보겠습니다. 다른 언어에서처럼 '%' 뒤의 줄을 분할할 수는 없습니다. 기본적으로 Python은 각 줄을 별도의 문으로 취급하기 때문입니다. 이것이 더하기 측면에서, 각 줄에 세미콜론을 입력할 필요가 없는 이유입니다. 이 문제를 해결하려면 전체 표현식을 괄호로 묶어 입력합니다. 그러면 표현식이 여러 줄에 걸쳐 적용될 수 있습니다. 이 코드 간 코드 기법은 아래에 설명된 다양한 그룹화 구성( ( ), [ ], { })에서 작동합니다.

  # Add parentheses to make the long line work:
  text = (
    "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

더 낫지만 여전히 줄이 약간 깁니다. Python을 사용하면 한 줄을 청크로 분할한 다음 자동으로 연결할 수 있습니다. 이 줄을 더 짧게 하려면 다음과 같이 할 수 있습니다.

  # Split the line into chunks, which are concatenated automatically by Python
  text = (
    "%d little pigs come out, "
    "or I'll %s, and I'll %s, "
    "and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

문자열 (유니코드와 바이트)

일반 Python 문자열은 유니코드입니다.

Python은 다음과 같이 일반 바이트 (문자열 리터럴 앞에 접두사 'b'로 표시됨)로 구성된 문자열도 지원합니다.

> byte_string = b'A byte string'
> byte_string
  b'A byte string'

유니코드 문자열은 바이트 문자열과는 다른 유형의 객체이지만 정규 표현식과 같은 다양한 라이브러리는 두 문자열 중 하나라도 전달된 경우 올바르게 작동합니다.

일반 Python 문자열을 바이트로 변환하려면 문자열에서 encode() 메서드를 호출합니다. 다른 방향으로 보면 바이트 문자열 encode() 메서드는 인코딩된 일반 바이트를 유니코드 문자열로 변환합니다.

> ustring = 'A unicode \u018e string \xf1'
> b = ustring.encode('utf-8')
> b
b'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding. Note the b-prefix.
> t = b.decode('utf-8')                ## Convert bytes back to a unicode string
> t == ustring                         ## It's the same as the original, yay!

True

파일 읽기 섹션에는 인코딩이 적용된 텍스트 파일을 열고 유니코드 문자열을 읽는 방법을 보여주는 예가 있습니다.

if 문

Python은 if/loops/function 등의 코드 블록을 포함하는 데 { }를 사용하지 않습니다. 대신 Python에서 콜론 (:)과 들여쓰기/공백을 사용하여 문을 그룹화합니다. if에 대한 불리언 테스트는 괄호 안에 넣지 않아도 되며 (C++/자바와의 큰 차이), *elif* 및 *else* 절을 포함할 수 있습니다 (니모닉: 단어 'elif'는 단어 'else'와 길이가 같음).

모든 값을 if-test로 사용할 수 있습니다. 없음, 0, 빈 문자열, 빈 목록, 빈 사전 등 '0' 값은 모두 거짓으로 간주됩니다. 또한 True와 False의 두 값을 가진 불리언 유형도 있습니다 (정수로 변환되며 1과 0임). Python에는 일반적인 비교 연산(==, !=, <, <=, >, >=)이 있습니다. Java 및 C와 달리 == 은 문자열과 올바르게 작동하도록 오버로드됩니다. 부울 연산자는 *and*, *or*, *not*이라는 단어로 철자가 되어 있습니다(Python에서는 C 스타일 && || !를 사용하지 않음). 하루 종일 음료를 추천하는 건강 앱의 코드는 다음과 같습니다. then/else 구문의 각 블록이 :로 시작하고 구문이 들여쓰기되어 어떻게 그룹화되는지 확인하세요.

  if time_hour >= 0 and time_hour <= 24:
    print('Suggesting a drink option...')
    if mood == 'sleepy' and time_hour < 10:
      print('coffee')
    elif mood == 'thirsty' or time_hour < 2:
      print('lemonade')
    else:
      print('water')

위의 코드를 입력할 때 ':'을 생략하는 것이 가장 흔한 문법 실수입니다. 이는 C++/Java 습관에 비해 더 많이 입력해야 하기 때문입니다. 또한 부울 테스트를 괄호로 묶지 마세요. 이는 C/Java 습관입니다. 코드가 짧으면 다음과 같이 ":" 뒤에 같은 줄에 코드를 넣을 수 있습니다 (함수, 루프 등에도 적용됨). 하지만 어떤 사람들은 별도의 줄에서 간격을 두는 것이 더 읽기 쉽다고 생각합니다.

  if time_hour < 10: print('coffee')
  else: print('water')

연습: string1.py

이 섹션의 자료를 연습하려면 기본 연습string1.py를 연습해 보세요.