{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### 문자열 (복습)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'hello! how are you?'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"HELLO! HOW ARE YOU?\".lower()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'THIS IS A WARNING!'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"this is a warning!\".upper()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "x = \"Once uppon a time, there was a prince and a princess.\".split(\" \")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Once',\n", " 'uppon',\n", " 'a',\n", " 'time,',\n", " 'there',\n", " 'was',\n", " 'a',\n", " 'prince',\n", " 'and',\n", " 'a',\n", " 'princess.']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Once uppon a time, there was a prince and a princess.'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\" \".join(x)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "53\n" ] } ], "source": [ "y = \"Once uppon a time, there was a prince and a princess.\"\n", "print(len(y))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.count('a')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Once uppon'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y[0:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 정규표현식" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import re " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 도트 - 패턴 검출 여부가 알고 싶을 때" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "my_expression = re.compile(\"c.t\") #정규표현식 #c와 t사이에 하나의 문자가 들어가는가?\n", " " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "x1 = \"ct\" #문자열\n", "x2 = \"cat\"\n", "x3 = \"caat\"" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if my_expression.search(x1): \n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #c와 t사이에 문자 안들어감" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if my_expression.search(x2):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #c와 t사이에 문자 들어감" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if my_expression.search(x3):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #c와 t사이에 문자 2개 들어감" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 0회 또는 1회 포함 \"?\"" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "my_exp = \"ca?t\" #정규표현식 #?바로 앞에 있는 문자가 0회 또는 1회 출현했는가?" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "x1 = \"ct\" #문자열\n", "x2 = \"cat\"\n", "x3 = \"caat\"" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x1): \n", " print(\"Yes!\") #?위치에서 바로 앞의 a가 0회 출현\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x2): \n", " print(\"Yes!\") #?위치에서 바로 앞의 a가 1회 출현\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x3): \n", " print(\"Yes!\") \n", "else:\n", " print(\"No\") #?위치에서 바로 앞의 a가 2회 출현" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 반복 {m,n}" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "my_exp= \"ca{1,2}t\" #정규표현식 #바로 앞에 있는 문자가 1~2회 반복되었는가?" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "x1 = \"ct\" #문자열\n", "x2 = \"cat\"\n", "x3 = \"caat\"\n", "x4 = \"caaat\"" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x1):\n", " print(\"Yes!\") \n", "else:\n", " print(\"No\") #a가 1회 반복되지 않음" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x2):\n", " print(\"Yes!\") #a가 1회 반복됨\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x3):\n", " print(\"Yes!\") #a가 2회 반복됨\n", "else:\n", " print(\"No\") " ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x4):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #a가 3회 반복됬지만 범위 벗어남" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 시작 ^" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "my_exp = \"^This\" #정규표현식 #This 패턴으로 시작하는가?" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "x1 = \"That is your book.\" #문자열\n", "x2 = \"This is my book.\"" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x1):\n", " print(\"Yes!\") \n", "else:\n", " print(\"No\") #This 패턴으로 시작안함" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x2):\n", " print(\"Yes!\") #This 패턴으로 시작\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 클래스 [ ] 와 ^의 조합" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "my_exp = \"^[Ii]\" #정규표현식 #대문자i나 소문자i로 시작하는게 있냐 \n", " #^가 밖에 있기때문에 시작하는거" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "x1 = \"I don't like you\" #문자열\n", "x2 = \"You are great\"\n", "x3 = \"in case you forget, remember this\"" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x1):\n", " print(\"Yes!\") #l이나 i로 시작하는 문자있음\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x2):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #l이나 i로 시작하는 문자없음" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x3):\n", " print(\"Yes!\") #l이나 i로 시작하는 문자있음\n", "else:\n", " print(\"No\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "또 다른 예:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "my_exp = \"^[0-9]\" #정규표현식 #0~9사이 숫자로 시작하는가?" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "x1 = \"This is year 2018\" #문자열\n", "x2 = \"2000 is th eyear of my birth\"" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x1):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #0~9사이 숫자로 시작안함" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x2):\n", " print(\"Yes!\") #0~9사이 숫자로 시작함\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 마지막 $" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "my_exp = \"Python$\" #정규표현식 #Python 패턴이 문자열의 제일 끝부분에 있는가?" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "x1 = \"Python is easy\" #문자열\n", "x2 = \"You need Python\"" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x1):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #Python 패턴이 문자열의 제일 끝부분에 없다" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x2):\n", " print(\"Yes!\") #Python 패턴이 문자열의 제일 끝부분에 있다\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### OR의 의미 |" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "my_exp = \"love|hate\" #정규표현식 #문자열에 love패턴이 있거나, hate패턴이 있거나, 둘다 없거나" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "x1 = \"I love you\" #문자열\n", "x2 = \"I hate you\"\n", "x3 = \"I like you\"" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x1):\n", " print(\"Yes!\") #문자열에 love패턴 있음\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yes!\n" ] } ], "source": [ "if re.search(my_exp, x2):\n", " print(\"Yes!\") #문자열에 hate패턴 있음\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No\n" ] } ], "source": [ "if re.search(my_exp, x3):\n", " print(\"Yes!\")\n", "else:\n", " print(\"No\") #문자열에 love패턴이나 hate패턴 없음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 자주 사용하는 문자 클래스와 sub()" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "x1 = \"Welcome to the year 2018\" #sub는 re가 제공하는 함수라 컴파일 필요업음\n", " #대체 후의 문자열 x1가져다가 숫자있으면 x처리해라?\n", "x2 = \"Just ~%* ++++--- arrived at @Jack's ##place.\"\n", "x3 = \"I love you.\"" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Welcome to the year XXXX'" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ " re.sub('\\d','X',x1) " ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Just arrived at Jack's place.\"" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x2_modified = re.sub('[@~*#%+-]',' ',x2) #대체는 컴파일없이 바로 가능함, 불필요한걸 스페이스로 모아뒀다가 하나의 스페이스로 합침\n", "x2_modified" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Just arrived at Jack's place.\"" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x2_final = re.sub('\\s+',' ',x2_modified) #여기서는 스페이스가 하나로 합체\n", "x2_final" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'I love you.'" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "re.sub('\\s+',' ',x3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }