{
    "componentChunkName": "component---src-templates-post-tsx",
    "path": "/regex/",
    "result": {"data":{"logo":null,"markdownRemark":{"html":"<h1>정규 표현식</h1>\n<ul>\n<li>정규표현식(regular expression)은 일종의 문자를 표현하는 공식으로, 특정 규칙이 있는 문자열 집합을 추출할 때 자주 사용되는 기법입니다.</li>\n<li>주로 Prograaming Language나 Text Editor등에서 문자열의 검색과 치환을 위한 용도로 쓰이고 있습니다.</li>\n</ul>\n<br>\n<h3>메타문자</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">. ^ $ * + ? {} [] \\ | ()</code></pre></div>\n<ul>\n<li>메타문자는 문자를 설명하기 위한 문자로, 문자의 구성을 설명하기 위해 원래의 의미가 아닌 다른 의미로 쓰이는 문자를 말합니다.</li>\n<li>정규표현식에서는 위와 같은 메타문자를 사용합니다.</li>\n</ul>\n<br>\n<h3>정규표현식: <code class=\"language-text\">[]</code></h3>\n<ul>\n<li>\n<p>문자 클래스인 <code class=\"language-text\">[]</code>는 <code class=\"language-text\">\"[] 사이의 문자들과 매치\"</code>라는 의미를 가지며, <code class=\"language-text\">[]</code>사이에는 어떤 문자도 들어갈 수 있습니다.</p>\n<ul>\n<li><code class=\"language-text\">[abc]</code>라면 이 표현식의 의미는 <code class=\"language-text\">\"a, b, c 중 한 개의 문자와 매치\"</code>를 뜻합니다.</li>\n</ul>\n</li>\n<li>\n<p>예시) <code class=\"language-text\">[abc]</code>가 <code class=\"language-text\">\"a\", \"before\", \"dude\"</code>와 어떻게 매치되는지 살펴보겠습니다.</p>\n<ul>\n<li><code class=\"language-text\">a</code>는 정규식과 일치하는 문자인 <code class=\"language-text\">a</code>가 있으므로 매치</li>\n<li><code class=\"language-text\">before</code>는 정규식과 일치하는 문자인 <code class=\"language-text\">b</code>가 있으므로 매치</li>\n<li><code class=\"language-text\">dude</code>는 정규식과 일치하는 문자인 <code class=\"language-text\">a, b, c</code>중 어느 하나도 포함하고 있지 않으므로 매치되지 않음</li>\n</ul>\n</li>\n</ul>\n<br>\n<h3>정규표현식: <code class=\"language-text\">하이픈(-), 캐럿(^)</code></h3>\n<ul>\n<li>\n<p>하이픈(-)은 두 문자 사이의 범위(from - to)를 의미, 캐럿(^)은 반대를 의미합니다.</p>\n<ul>\n<li><code class=\"language-text\">[a-zA-Z]</code>: 알파벳 모두 매치</li>\n<li><code class=\"language-text\">[0-9]</code>: 숫자 매치</li>\n<li><code class=\"language-text\">[^0-9]</code>: 숫자가 아닌 문자만 매치\n<ul>\n<li><code class=\"language-text\">[]</code>안에서는 부정의 의미로 사용</li>\n<li><code class=\"language-text\">[]</code>가 없으면 문자열의 처음을 뜻함(끝은 $로 표시)</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>문자클래스<code class=\"language-text\">[]</code>안에는 어떤 문자나 메타 문자도 사용할 수 있지만 <code class=\"language-text\">^</code>는 반대(not)의 의미로 사용되기 때문에 조심해야합니다.</p>\n</li>\n</ul>\n<br>\n<h3>정규표현식: <code class=\"language-text\">\\역슬래쉬</code></h3>\n<ul>\n<li>\n<p><code class=\"language-text\">[0-9]</code>또는 <code class=\"language-text\">[a-zA-Z]</code>와 같은 정규표현식은 <code class=\"language-text\">\\역슬래쉬</code>를 이용해 간단하게 표현할 수 있습니다. 이번엔 <code class=\"language-text\">\\역슬래쉬</code>를 사용한 별도의 표기법들에 대해 알아보겠습니다.</p>\n</li>\n<li>\n<ul>\n<li><code class=\"language-text\">\\d</code> - 숫자와 매치, <code class=\"language-text\">[0-9]</code>와 동일한 표현식이다.</li>\n<li><code class=\"language-text\">\\D</code> - 숫자가 아닌 것과 매치, <code class=\"language-text\">[^0-9]</code>와 동일한 표현식이다.</li>\n<li><code class=\"language-text\">\\s</code> - whitespace 문자와 매치, <code class=\"language-text\">[ \\t\\n\\r\\f\\v]</code>와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.</li>\n<li><code class=\"language-text\">\\S</code> - whitespace 문자가 아닌 것과 매치, <code class=\"language-text\">[^\\t\\n\\r\\f\\v]</code>와 동일한 표현식이다.</li>\n<li><code class=\"language-text\">\\w</code> - 문자+숫자(alphanumeric)와 매치, <code class=\"language-text\">[a-zA-Z0-9_]</code>와 동일한 표현식이다.</li>\n<li><code class=\"language-text\">\\W</code> - 문자+숫자(alphanumeric)가 아닌 문자와 매치, <code class=\"language-text\">[^a-zA-Z0-9_]</code>와 동일한 표현식이다.</li>\n<li><code class=\"language-text\">\\s</code> - 스페이스(공백문자), 탭과 매치, <code class=\"language-text\">[\\t\\n\\f\\r]</code>과 동일한 표현식이다.</li>\n<li><code class=\"language-text\">\\S</code> - 스페이스 외 문자와 매치, <code class=\"language-text\">[^\\t\\n\\f\\r]</code>과 동일한 표현식이다.</li>\n</ul>\n</li>\n<li>\n<p>대문자로 사용된 것은 소문자의 반대임을 추측할 수 있습니다.</p>\n</li>\n<li>\n<p>또한 정규식 상의 특별한 의미가 있는 문자들을 문자 그대로 쓸 때 앞에 붙혀 사용됩니다.</p>\n</li>\n</ul>\n<br>\n<h3>정규표현식: ‘Dot(.)’</h3>\n<ul>\n<li>줄바꿈 문자인 <code class=\"language-text\">\\n</code>을 제외한 모든 문자와 매치됨을 의미합니다.</li>\n</ul>\n<p>다음 정규식을 보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">a.b</code></pre></div>\n<p>위 정규식의 의미는 <code class=\"language-text\">\"a + 모든문자 + b\"</code>와 같습니다.</p>\n<ul>\n<li>즉 a와b라는 문자 사이에 어떤 문자가 들어가도 모두 매치가 된다는 의미입니다.\n<ul>\n<li>예시로 <code class=\"language-text\">\"aab\", \"a0b\", \"abc\"</code>를 보겠습니다.\n<ul>\n<li><code class=\"language-text\">aab</code>는 가운데 문자 <code class=\"language-text\">a</code>가 모든 문자를 의미하는 <code class=\"language-text\">.</code>과 일치하므로 정규식과 매치됩니다.</li>\n<li><code class=\"language-text\">a0b</code>도 동일하게 가운데 문자 <code class=\"language-text\">0</code>이 모든 문자를 의미하는 <code class=\"language-text\">.</code>과 일치하므로 정규식과 매치됩니다.</li>\n<li><code class=\"language-text\">abc</code>는 <code class=\"language-text\">a</code>와 <code class=\"language-text\">b</code>사이에 어떤 문자가 존재하지 않기 때문에 위 정규식과 매치되지 않습니다.</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<p>그렇다면 이 정규식은 어떨까요?</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">a[.]b</code></pre></div>\n<p>앞서 설명드렸다 싶이 문자클래스<code class=\"language-text\">[]</code>는 내부에 메타문자가 들어가더라도 문자 그대로 인식해주는 특징을 갖고 있습니다.\n따라서 <code class=\"language-text\">a.b</code>와 매치되고 <code class=\"language-text\">a0b</code>와 같은 문자열은 매치되지 않습니다.</p>\n<br>\n<h3>정규표현식: 반복 관련 메타 문자 <code class=\"language-text\">* + ? {}</code></h3>\n<ul>\n<li>반복(*)\n<ul>\n<li>메타문자 <code class=\"language-text\">*</code>은 <code class=\"language-text\">*</code>바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있다는 의미입니다.</li>\n</ul>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">ca*t</code></pre></div>\n<ul>\n<li>\n<p>위 정규식은 <code class=\"language-text\">c + a(0번 이상 반복) + t</code>라는 것을 알 수 있습니다.</p>\n<ul>\n<li><code class=\"language-text\">ct</code>, <code class=\"language-text\">cat</code>, <code class=\"language-text\">caaaat</code> 모두 매치됩니다.</li>\n</ul>\n</li>\n<li>\n<p>반복(+)</p>\n<ul>\n<li>반복을 나타내는 또 다른 문자인 <code class=\"language-text\">+</code>입니다. <code class=\"language-text\">+</code>는 <code class=\"language-text\">*</code>과 달리 최소 1번 이상 반복될 때 사용합니다. 즉 <code class=\"language-text\">*</code>은 반복횟수가 0부터 시작, <code class=\"language-text\">+</code>는 반복횟수가 1부터 시작됩니다.</li>\n<li><code class=\"language-text\">ct</code>, <code class=\"language-text\">cat</code>, <code class=\"language-text\">caaat</code>중 <code class=\"language-text\">ct</code>는 매치되지 않습니다.</li>\n</ul>\n</li>\n<li>\n<p>반복({m,n})</p>\n<ul>\n<li><code class=\"language-text\">{}</code>는 원하는 반복횟수를 지정하고 싶을 때 사용됩니다. m에서 n까지 반복, m이상인 경우, n이하인 경우 등 자유롭게 원하는 만큼 조절이 가능합니다.\n<ol>\n<li><code class=\"language-text\">{m}</code>: 반드시 m번 반복\n<ul>\n<li><code class=\"language-text\">ca{2}t</code>: “c + a(반드시 2번 반복) + t”</li>\n</ul>\n</li>\n<li><code class=\"language-text\">{m, n}</code>: m~n회 반복\n<ul>\n<li><code class=\"language-text\">ca{2, 5}t</code>: “c + a(2~5회 반복) + t”</li>\n</ul>\n</li>\n<li><code class=\"language-text\">{m,}, {,n}</code>: m회 이상 반복, n회 이하 반복</li>\n</ol>\n</li>\n</ul>\n</li>\n<li>\n<p>반복(?)</p>\n<ul>\n<li><code class=\"language-text\">?</code>는 반복은 아니지만 비슷한 개념으로 <code class=\"language-text\">{0, 1}</code>과 같은 의미를 지닙니다. 즉, 문자가 있거나 없거나 둘 다 매치 되는 경우입니다.</li>\n<li><code class=\"language-text\">ab?c</code> : “a + b(있어도 되고 없어도 된다) + c”</li>\n</ul>\n</li>\n</ul>\n<p><code class=\"language-text\">*</code>, <code class=\"language-text\">+</code>, <code class=\"language-text\">?</code>메타 문자는 모두 <code class=\"language-text\">{m, n}</code> 형태로 고쳐 쓰는 것이 가능하지만 가급적 이해하기 쉽고 간결한 <code class=\"language-text\">*</code>, <code class=\"language-text\">+</code>, <code class=\"language-text\">?</code>메타 문자를 사용하는 것이 좋습니다.</p>\n<br>\n<h3>ex) 주민등록번호 정규표현식</h3>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">/^\\d{2}[0-1]\\d{1}[0-3]\\d{1}\\-[1-4]\\d{6}$/</code></pre></div>\n<ul>\n<li><code class=\"language-text\">^</code>: Start of String</li>\n<li><code class=\"language-text\">\\d{3}</code>: 1-2번째(년도) 숫자 0-9</li>\n<li><code class=\"language-text\">[0-1]</code>: 3번째(월도 앞자리) 0,1</li>\n<li><code class=\"language-text\">\\d{1}</code>: 4번째(월도 뒷자리) 숫자 0-9</li>\n<li><code class=\"language-text\">[0-3]</code>: 5번째(일자 앞자리) 0,1,2,3</li>\n<li><code class=\"language-text\">\\d{1}</code>: 6번째(일자 뒷자리) 숫자 0-9</li>\n<li><code class=\"language-text\">\\-</code> : 7번째(구분자) -</li>\n<li><code class=\"language-text\">[1-4]</code>: 8번째(성별) 90년대생 1,2 2000년대생 3,4</li>\n<li><code class=\"language-text\">\\d{6}</code>: 9-14번째(뒷자리 6자리) 숫자 0-9</li>\n<li><code class=\"language-text\">$</code>: End of String</li>\n</ul>\n<br>\n<h2>파이썬과 정규표현식</h2>\n<p>파이썬은 정규 표현식을 지원하기 위해 re(regular expression)모듈을 제공합니다.</p>\n<p>Usage</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">import re\npattern = re.compile(&quot;정규식&quot;)</code></pre></div>\n<p>re.compile을 사용하여 정규 표현식을 컴파일합니다. re.compile의 결과인 객체 <code class=\"language-text\">pattern</code>에 입력한 정규식의 대한 정보가 담겨있습니다.</p>\n<p>이제 <code class=\"language-text\">pattern</code>객체를 이용해 문자열 검색을 수행해보겠습니다. 컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공합니다.\n<img src=\"https://user-images.githubusercontent.com/59256704/133471058-446759bb-eeeb-4000-b6ef-6ca795be12df.png\" alt=\"image\"></p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">import re\np = re.compile(&#39;[a-z]+&#39;)</code></pre></div>\n<p>위 코드를 실행해 생성된 객체 <code class=\"language-text\">p</code>로 메서드를 살펴보겠습니다.</p>\n<br>\n<h3>match</h3>\n<ul>\n<li>match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사하며, 반환값으로 match 객체를 돌려줍니다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; m = p.match(&quot;python&quot;)\n&gt;&gt;&gt; print(m)\n&lt;_sre.SRE_Match object at 0x01F3F9F8&gt;</code></pre></div>\n<p><code class=\"language-text\">python</code>문자열은 <code class=\"language-text\">[a-z]+</code>정규식에 부합되므로 match 객체를 돌려줍니다.</p>\n<p>따라서 파이썬 정규식 프로그램은 다음과 같이 작성해 매치 여부를 확인합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">p = re.compile(정규표현식)\nm = p.match(문자열)\n\nif m:\n    print(&quot;정규식 일치&quot;)\nelse:\n    print(&quot;정규식 불일치&quot;)</code></pre></div>\n<br>\n<h3>search</h3>\n<p>동일하게 컴파일된 객체 p를 갖고 이번엔 search 메서드를 수행해보겠습니다. 예시를 통해 match와의 차이점을 확인해보시면 좋을 것 같습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; m = p.search(&quot;3 python&quot;)\n&gt;&gt;&gt; print(m)\n&lt;_sre.SRE_Match object at 0x01F3FA30&gt;</code></pre></div>\n<p><code class=\"language-text\">3 python</code>문자열은 첫번째 문자가 숫자이므로 match메서드에서는 None을 반환합니다. 하지만 search메서드는 문자열의 처음부터 검색하는 것이 아니라 문자열 전체를 검색하기 때문에 “python”문자열과 매치돼서 match객체를 반환하게 됩니다.</p>\n<br>\n<h3>findall</h3>\n<p><code class=\"language-text\">findall</code> 메서드는 이름 그대로 문자열에서 정규식과 일치하는 부분을 찾아 리스트로 반환시켜줍니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; result = p.findall(&quot;life is too short&quot;)\n&gt;&gt;&gt; print(result)\n[&#39;life&#39;, &#39;is&#39;, &#39;too&#39;, &#39;short&#39;]</code></pre></div>\n<p>정규식과 일치하는 부분인 각 단어들이 반환되는 것을 확인할 수 있습니다.</p>\n<br>\n<h3>finditer</h3>\n<p>finditer는 findall과 동일하지만 그 결과로 반복 가능한 객체를 돌려줍니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; result = p.finditer(&quot;life is too short&quot;)\n&gt;&gt;&gt; print(result)\n&lt;callable_iterator object at 0x01F5E390&gt;\n&gt;&gt;&gt; for r in result: print(r)\n...\n&lt;_sre.SRE_Match object at 0x01F3F9F8&gt;\n&lt;_sre.SRE_Match object at 0x01F3FAD8&gt;\n&lt;_sre.SRE_Match object at 0x01F3FAA0&gt;\n&lt;_sre.SRE_Match object at 0x01F3F9F8&gt;</code></pre></div>\n<p>반복 가능한 객체가 포함하는 각각의 요소는 match 객체입니다.</p>\n<br>\n<h2>match 객체의 메서드</h2>\n<p>계속 반환받아왔던 match객체를 써먹어야겠죠? 이번엔 match객체의 메서드들에 대해 알아보겠습니다.</p>\n<p><img src=\"https://user-images.githubusercontent.com/59256704/133474331-97272bd8-2286-45c7-b026-db5e6948cb8f.png\" alt=\"image\"></p>\n<p>다음 예시로 살펴보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; m = p.match(&quot;python&quot;)\n&gt;&gt;&gt; m.group()\n&#39;python&#39;\n&gt;&gt;&gt; m.start()\n0\n&gt;&gt;&gt; m.end()\n6\n&gt;&gt;&gt; m.span()\n(0, 6)</code></pre></div>\n<p>예상된 결과값입니다. 만약 match메서드를 사용해 반환된 match메서드라면 start()의 결과값은 항상 0일 것입니다. match메서드는 항상 문자열의 시작부터 조사하기 때문이죠.</p>\n<p>만약 search 메서드를 사용했다면 start()값은 다르게 나올 것입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; m = p.search(&quot;3 python&quot;)\n&gt;&gt;&gt; m.group()\n&#39;python&#39;\n&gt;&gt;&gt; m.start()\n2\n&gt;&gt;&gt; m.end()\n8\n&gt;&gt;&gt; m.span()\n(2, 8)</code></pre></div>\n<p>이처럼 문자열에서 정규식이 해당되는 부분의 첫 시작지점이 나오게 됩니다.</p>\n<p>※ 모듈 단위로 수행</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; m = re.match(&#39;[a-z]+&#39;, &quot;python&quot;)</code></pre></div>\n<p>다음과 같이 축약된 형태로도 사용가능합니다.</p>\n<br>\n<h2>컴파일 옵션</h2>\n<p>정규식을 컴파일할 때 다음 옵션을 사용할 수 있습니다.</p>\n<ul>\n<li>DOTALL(S) - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다.</li>\n<li>IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다.</li>\n<li>MULTILINE(M) - 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)</li>\n<li>VERBOSE(X) - verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)</li>\n</ul>\n<p>옵션을 사용할 때는 <code class=\"language-text\">re.DOTALL</code>처럼 전체 옵션이름을 써도 되고, <code class=\"language-text\">re.S</code>처럼 약어를 써도 됩니다.</p>\n<br>\n<h3>DOTALL, S</h3>\n<p><code class=\"language-text\">.</code>메타 문자가 줄바꿈 문자<code class=\"language-text\">\\n</code>도 포함시키도록 하고 싶다면 <code class=\"language-text\">re.DOTALL</code>또는 <code class=\"language-text\">re.S</code>옵션을 사용해 정규식을 컴파일하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; p = re.compile(&#39;a.b&#39;, re.DOTALL)\n&gt;&gt;&gt; m = p.match(&#39;a\\nb&#39;)\n&gt;&gt;&gt; print(m)\n&lt;_sre.SRE_Match object at 0x01FCF3D8&gt;</code></pre></div>\n<p><code class=\"language-text\">re.DOTALL</code>옵션으로 <code class=\"language-text\">\\n</code>도 매치시키는 것을 확인할 수 있습니다.</p>\n<br>\n<h3>IGNORECASE, I</h3>\n<p><code class=\"language-text\">re.IGNORECASE</code> 또는 <code class=\"language-text\">re.I</code> 옵션은 대소문자 구별 없이 매치를 수행할 때 사용하는 옵션입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; p = re.compile(&#39;[a-z]&#39;, re.I)\n&gt;&gt;&gt; p.match(&#39;python&#39;)\n&lt;_sre.SRE_Match object at 0x01FCFA30&gt;\n&gt;&gt;&gt; p.match(&#39;Python&#39;)\n&lt;_sre.SRE_Match object at 0x01FCFA68&gt;\n&gt;&gt;&gt; p.match(&#39;PYTHON&#39;)\n&lt;_sre.SRE_Match object at 0x01FCF9F8&gt;</code></pre></div>\n<p><code class=\"language-text\">[a-z]</code> 정규식은 소문자만을 의미하지만 re.I옵션으로 대소문자 구별없이 매치되는 것을 볼 수 있습니다.</p>\n<br>\n<h3>MULTILINE, M</h3>\n<p><code class=\"language-text\">^</code>은 문자열의 처음, <code class=\"language-text\">$</code>은 문자열의 마지막을 의미합니다. 자세한 설명 전에 다음 예시를 살펴보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">import re\np = re.compile(&quot;^python\\s\\w+&quot;)\n\ndata = &quot;&quot;&quot;python one\nlife is too short\npython two\nyou need python\npython three&quot;&quot;&quot;\n\nprint(p.findall(data))</code></pre></div>\n<p>결과</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">[&#39;python one&#39;]</code></pre></div>\n<p>결과를 보면 알겠지만 <code class=\"language-text\">^</code>메타 문자에 의해 python이라는 문자열을 사용한 첫 번째 줄만 매치된 것을 알 수 있습니다.</p>\n<p>하지만 <code class=\"language-text\">^</code>메타 문자를 문자열 전체의 처음이 아니라 각 라인의 처음으로 인식시키고 싶은 경우가 있을 것입니다. 이럴 때 사용하는 옵션이 바로 <code class=\"language-text\">re.MULTILINE</code> 옵션입니다.</p>\n<p>위 코드에 <code class=\"language-text\">re.MULTILINE</code>옵션을 추가해보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import re\np = re.compile(\"^python\\s\\w+\", re.MULTILINE)\n\ndata = \"\"\"python one\nlife is too short\npython two\nyou need python\npython three\"\"\"\n\nprint(p.findall(data))</code></pre></div>\n<p>결과</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">[&#39;python one&#39;, &#39;python two&#39;, &#39;python three&#39;]</code></pre></div>\n<p>다음과 같이 <code class=\"language-text\">^</code>메타 문자가 문자열의 각 줄마다 적용되는 것을 확인할 수 있습니다.</p>\n<br>\n<h3>VERBOSE, X</h3>\n<p>여태 봐왔듯이 정규식은 굉장히 가독성이 안좋은 것을 알 수 있습니다. 이런 정규식의 가독성을 조금이나마 해결해주기 위한 옵션이 바로 <code class=\"language-text\">VERBOSE</code>입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">charref = re.compile(r&#39;&amp;[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);&#39;)</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">charref = re.compile(r&quot;&quot;&quot;\n &amp;[#]                # Start of a numeric entity reference\n (\n     0[0-7]+         # Octal form\n   | [0-9]+          # Decimal form\n   | x[0-9a-fA-F]+   # Hexadecimal form\n )\n ;                   # Trailing semicolon\n&quot;&quot;&quot;, re.VERBOSE)</code></pre></div>\n<p>첫 번째와 두 번째 예를 비교해보면 패턴 객체인 <code class=\"language-text\">charref</code>는 모두 동일한 역할을 합니다. 하지만 두번째처럼 주석을 적고 여러 줄로 표현하는 것이 가독성이 좋은 것을 알 수 있습니다.</p>\n<p><code class=\"language-text\">re.VERBOSE</code>옵션은 문자열에 사용된 whitespace가 컴파일시 제거되며, #을 이용해 주석문을 달 수 있습니다.</p>\n<br>\n<h2>백슬래시 문제</h2>\n<p>정규표현식을 파이썬에서 사용할 때 혼란을 주는 요소가 있습니다. 바로 백슬래시인데요.</p>\n<p>예를들어 <code class=\"language-text\">\\section</code> 문자열을 찾기 위한 정규식을 만든다고 가정해봅시다.</p>\n<p>우리의 의도와 달리 <code class=\"language-text\">\\s</code>문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">[ \\t\\n\\r\\f\\v]ection</code></pre></div>\n<p>즉 이 것과 같은 의미를 가지게 됩니다.</p>\n<p>우리가 의도한 결과를 얻기 위해선 다음과 같이 변경해줘야 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\\\\section</code></pre></div>\n<p>그런데 파이썬에서는 파이썬 문자열 리터럴 규칙에 따라 <code class=\"language-text\">\\\\</code>이 <code class=\"language-text\">\\</code>로 변경되어 <code class=\"language-text\">\\section</code>이 전달됩니다.</p>\n<p>따라서 우리가 원하는 결과를 얻기위해서 무려 <code class=\"language-text\">\\\\\\\\</code>처럼 백슬래시를 4개나 사용해야됩니다.</p>\n<p>이러한 문제를 해결하기 위해 파이썬 정규식에는 Raw String 규칙이 생겨났습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">p = re.compile(r&#39;\\\\section&#39;)</code></pre></div>\n<p>다음과 같이 <code class=\"language-text\">r</code>을 문자열 앞에 붙혀 Raw String임을 알려줄 수 있습니다.</p>\n<br>\n<h3>정규표현식: 그룹</h3>\n<p>그룹화는 말 그대로 그룹으로 묶어주는 것입니다. 지금까지 사용했던 정규식들은 한 문자에만 적용됐습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; re.findall(&#39;12+&#39;, &#39;12 1212 1222&#39;)\n[&#39;12&#39;, &#39;12&#39;, &#39;12&#39;, &#39;1222&#39;]</code></pre></div>\n<p><code class=\"language-text\">1212</code>와 같은 문자를 찾고 싶은데, <code class=\"language-text\">12</code>혹은 <code class=\"language-text\">1222</code>만 찾아지는 경우입니다. 즉 메타문자 <code class=\"language-text\">+</code>가 <code class=\"language-text\">2</code>에만 적용된 것입니다.</p>\n<p>만약 우리가 <code class=\"language-text\">12</code>가 반복되는 문자를 찾고싶다면 <code class=\"language-text\">12</code>를 소괄호로 그룹화 시켜주면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">print(re.match(&#39;(12)+&#39;, &#39;1212&#39;))\nprint(re.search(&#39;(12)+&#39;, &#39;1212&#39;))\nprint(re.findall(&#39;(12)+&#39;, &#39;1212&#39;))\nprint(re.fullmatch(&#39;(12)+&#39;, &#39;1212&#39;))</code></pre></div>\n<p>결과</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&lt;_sre.SRE_Match object; span=(0, 4), match=&#39;1212&#39;&gt;\n&lt;_sre.SRE_Match object; span=(0, 4), match=&#39;1212&#39;&gt;\n[&#39;12&#39;]\n&lt;_sre.SRE_Match object; span=(0, 4), match=&#39;1212&#39;&gt;</code></pre></div>\n<p>우리가 원하는 <code class=\"language-text\">1212</code>를 잘 찾은 것을 볼 수 있습니다.\n그런데 re.findall의 결과가 이상합니다. 어째서 <code class=\"language-text\">['12']</code>가 나온 것일까요??</p>\n<p>이는 바로 괄호가 가진 다른 기능인 캡처 때문입니다.</p>\n<br>\n<h3>정규표현식: 캡처</h3>\n<p>캡처란 원하는 부분만을 추출하고 싶을 때 사용하는 것입니다. 예를들어 <code class=\"language-text\">yyyy-mm-dd</code>와 같이 날짜를 나타내는 문자열 중 월, 일을 각각 따로 빼서 쓰고 싶다면 <code class=\"language-text\">mm</code>과 <code class=\"language-text\">dd</code>부분에 캡처기능을 사용하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">print(re.findall(&#39;\\d{4}-(\\d\\d)-(\\d\\d)&#39;, &#39;2028-07-28&#39;))\nprint(re.findall(&#39;\\d{4}-(\\d\\d)-(\\d\\d)&#39;, &#39;1999/05/21 2018-07-28 2019.01.01&#39;))</code></pre></div>\n<p>결과</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">[(&#39;07&#39;, &#39;28&#39;)]\n[(&#39;07&#39;, &#39;28&#39;)]</code></pre></div>\n<p>정규식의 내용과 일치하고, 월과 일에 해당하는 부분만 따로 빠졌음을 알 수 있습니다.</p>\n<br>\n<h3>groups()</h3>\n<p>기존에 match객체에서 일치되는 문자열을 반환하는 <code class=\"language-text\">group()</code>메서드를 알아봤었습니다.\n<code class=\"language-text\">group()</code>과는 다르게 <code class=\"language-text\">groups()</code>메서드는 명시적으로 캡처(<code class=\"language-text\">()</code>로 감싼 부분)한 부분을 반환합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; m = re.search(&#39;\\d{4}-(\\d?\\d)-(\\d?\\d)&#39;, &#39;1868-12-10&#39;)\n&gt;&gt;&gt; print(m)\n&lt;_sre.SRE_Match object; span=(0, 10), match=&#39;1868-12-10&#39;&gt;\n&gt;&gt;&gt; print(m.group())\n1868-12-10\n&gt;&gt;&gt; print(m.groups())\n(&#39;12&#39;, &#39;10&#39;)</code></pre></div>\n<p>이처럼 캡처시킨 부분을 반환시키는 것을 볼 수 있습니다. 또한 <code class=\"language-text\">group()</code>메서드로 부터 캡처된 내용을 추출할 수도 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">m.group(): 1868-12-10\nm.group(0): 1868-12-10\nm.group(1): 12\nm.group(2): 10\nm.groups(): (&#39;12&#39;, &#39;10&#39;)</code></pre></div>\n<br>\n<h3>비 캡처 그룹</h3>\n<p>그렇다면 그룹화를 위해 소괄호를 반드시 써야 되는데, 굳이 캡처하고 싶지는 않을 때가 있습니다. 그럴 경우에 바로 비캡쳐그룹을 사용합니다.</p>\n<p>비캡처그룹은 <code class=\"language-text\">(?:&lt;regex>)</code>와 같이 사용됩니다. 아까 원하는 결과였던 <code class=\"language-text\">1212</code>대신 <code class=\"language-text\">12</code>가 출력됐던 예제를 다시 가져와 적용시켜보겠습니다.</p>\n<p>기존 코드</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.findall(&#39;(12)+&#39;, &#39;1212&#39;))\n[&#39;12&#39;]</code></pre></div>\n<p>변경 코드</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.findall(&#39;(?:12)+&#39;, &#39;1212&#39;))\n[&#39;1212&#39;]</code></pre></div>\n<p>이런 식으로 비 캡처 그룹을 생성시켜 원하는 결과를 얻을 수 있습니다.</p>\n<br>\n<h3>(숫자): 앞서 일치된 문자열을 다시 비교</h3>\n<p>앞뒤가 똑같은 세글자 단어를 찾아봅시다. ex)토마토, ABA</p>\n<p>이를 위해선 조금 전 사용했던 캡처가 꼭 필요합니다. 하지만 캡처된 문자열을 접근하기 위해선 한번의 match 과정이 필요했습니다.</p>\n<p>하지만 정규식 내에서 캡처된 그룹에 접근하는 방법도 존재합니다. 바로 <code class=\"language-text\">\\(숫자)</code>입니다.\n<code class=\"language-text\">\\ </code>이후에 등장하는 숫자번호(N)가 바로 캡처 그룹의 번호로 즉 N번째의 그룹을 재참조한다는 의미입니다.</p>\n<p>예시를 하나 살펴보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.search(r&#39;(\\w)\\w\\1&#39;, &#39;토마토 ABC aba xyxy &#39;).group())\n토마토\n&gt;&gt;&gt; print(re.findall(r&#39;(\\w)\\w\\1&#39;, &#39;토마토 ABC aba xyxy &#39;))\n[&#39;토&#39;, &#39;a&#39;, &#39;x&#39;]</code></pre></div>\n<p>첫번째는 우리가 원하는 답이지만 search는 하나밖에 찾지 못하므로 완벽한 답이 아닙니다.</p>\n<p>두번째 또한 <code class=\"language-text\">()</code>에 의해서 캡처 그룹만을 반환돼 우리가 원하지 않는 결과를 보입니다.</p>\n<p>이런 문제를 해결하기 위해서 캡처를 하나 더 만들어 줍니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.findall(r&#39;((\\w)\\w\\2)&#39;, &#39;토마토 ABC aba xyxy &#39;))\n[&#39;토마토&#39;, &#39;aba&#39;, &#39;xyx&#39;]</code></pre></div>\n<p>여기서 재참조부가 <code class=\"language-text\">\\2</code>인 이유는 우리가 참조해야될 <code class=\"language-text\">(\\w)</code>그룹이 바깥 괄호로 인해 두번째 그룹으로 변경됐기 때문입니다.\n따라서 우리는 <code class=\"language-text\">\\1</code>이 아닌 <code class=\"language-text\">\\2</code>를 입력해줘야 됩니다.</p>\n<p>이러한 <code class=\"language-text\">\\1</code>, <code class=\"language-text\">\\2</code>와 같은 것들을 비 명명 그룹이라고 합니다.</p>\n<br>\n<h3>명명 그룹</h3>\n<p><code class=\"language-text\">\\(숫자)</code>와 같은 방법은 간편하지만 눈에 잘 들어오지 않습니다.</p>\n<p>많은 프로그래밍 언어의 정규표현식은 명명 그룹 기능을 지원합니다.\n언어마다 쓰는 방법이 다르지만, 파이썬 기준으로는 <code class=\"language-text\">(?P&lt;name>regex)</code>형식으로 씁니다.</p>\n<p>이번에도 예시를 하나 살펴보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">match_obj = re.match(\n    r&#39;(?P&lt;year&gt;\\d{4})-(?P&lt;month&gt;\\d\\d)-(?P&lt;day&gt;\\d\\d) (?P=year)\\.(?P=month)\\.(?P=day)&#39;,\n    &#39;2018-07-28 2018.07.28&#39;)\n\nprint(match_obj.group())\nprint(match_obj.groups())\nprint(match_obj.group(1))</code></pre></div>\n<p>결과</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">2018-07-28 2018.07.28\n(&#39;2018&#39;, &#39;07&#39;, &#39;28&#39;)\n2018</code></pre></div>\n<p>이런 식으로 기존 비명명 방식은 그룹의 번호를 지정해줘야 됐지만, 명명그룹은 하나의 변수처럼 그룹을 정의해 재참조해가며 사용할 수 있습니다.</p>\n<br>\n<h3>정규표현식: 치환</h3>\n<p>파이썬의 <code class=\"language-text\">replace</code>메서드는 정규식 패턴에 대응하는 문자열을 찾아주지 못합니다. 따라서 <code class=\"language-text\">re.sub</code>메서드가 필요합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.sub(pattern=&#39;Gorio&#39;, repl=&#39;Ryan&#39;, count=2, \\\n             string=&#39;Gorio, Gorio, Gorio keep a straight face.&#39;))\nRyan, Ryan, Gorio keep a straight face.</code></pre></div>\n<p><code class=\"language-text\">re.sub</code>메서드의 파라미터를 살펴보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">pattern: 매치시킬 패턴 \nrepl: 변경할 문자\nstring: 적용 문자열\ncount: 치환개수(최대값)</code></pre></div>\n<p>번외로 <code class=\"language-text\">re.subn</code>메서드는 치환된 문자열과 더불어 치환된 개수의 튜플을 반환합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">(&#39;Ryan, Ryan, Gorio keep a straight face.&#39;, 2)</code></pre></div>\n<p><code class=\"language-text\">re.sub</code>에 이전에 보았던 <code class=\"language-text\">\\(숫자)</code>를 이용할 수도 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.sub(&#39;(\\d{4})-(\\d{2})-(\\d{2})&#39;, \n             r&#39;\\1.\\2.\\3&#39;,\n             &#39;1900-01-01&#39;))\n1900.01.01</code></pre></div>\n<p>yyyy-mm-dd 형식을 yyyy.mm.dd 형식으로 변경됐습니다. 비명명방식이 된다면 명명방식도 가능하겠죠??</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.sub(&#39;(?P&lt;year&gt;\\d{4})-(?P&lt;month&gt;\\d{2})-(?P&lt;day&gt;\\d{2})&#39;,\n             &#39;\\g&lt;year&gt;.\\g&lt;month&gt;.\\g&lt;day&gt;&#39;,\n             &#39;1900-01-01&#39;))\n1900.01.01</code></pre></div>\n<br>\n<h3>정규표현식: split</h3>\n<p><code class=\"language-text\">re.sub</code>말고도 유용한 함수인 <code class=\"language-text\">re.split</code>입니다. 이 메서드는 파이썬 문자열의 기본 메서드인 <code class=\"language-text\">split</code>과 매우 유사합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">&gt;&gt;&gt; print(re.split(&#39;&lt;[^&lt;&gt;]*&gt;&#39;,\n               &#39;&lt;html&gt; Wow &lt;head&gt; header &lt;/head&gt; &lt;body&gt; Hey &lt;/body&gt; &lt;/html&gt;&#39;))\n[&#39;&#39;, &#39; Wow &#39;, &#39; header &#39;, &#39; &#39;, &#39; Hey &#39;, &#39; &#39;, &#39;&#39;]</code></pre></div>\n<p>정규식에 일치하는 부분을 기준으로 split이 되는 것을 볼 수 있습니다.</p>\n<br>\n<h3>정규표현식: 연산을 섞은 치환</h3>\n<p><code class=\"language-text\">re.sub</code>를 쓸 때 일치부에 나타나지도 않고, literal text에도 나타나지 않는 문자열로 치환하고 싶은 경우가 있을 수 있습니다.</p>\n<p><code class=\"language-text\">re.sub</code>는 인자 repl을 받을때 함수로도 받을 수 있습니다. 함수는 인자로 match 객체를 받으며 문자열을 반환해야 합니다.</p>\n<p>예를 들어 소수로 표현된 숫자를 찾은다음 퍼센티지로 변환하는 것을 정규식으로 써보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">def convert_percentage(match_obj):\n    number = float(match_obj.group())\n    return str(number * 100) + &#39;%&#39;\n\nprint(re.sub(pattern=r&#39;\\b0\\.\\d+\\b&#39;,\n             repl=convert_percentage,\n             string=&#39;Red 0.250, Green 0.001, Blue 0.749, Black 1.5&#39;))</code></pre></div>\n<p>결과</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">Red 25.0%, Green 0.1%, Blue 74.9%, Black 1.5</code></pre></div>\n<br>\n<h3>정규표현식: 조건문</h3>\n<p>정규표현식도 까다롭지만 조건문을 만들어 줄 수 있습니다. 정규표현식에서의 조건문은 다음과 같습니다.</p>\n<p>조건문은, 캡처 그룹을 사용해 앞에서 문자열이 일치되었는지 아닌지에 따라 다음 부분에서는 다른 일치 조건을 제시해야 할 때 쓰입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"angular2html\"><pre class=\"language-angular2html\"><code class=\"language-angular2html\">(?(숫자)맞으면|아니면)</code></pre></div>\n<p>여기서 숫자는 캡처와 비슷합니다. 앞에서 재참조부를 쓸 때 <code class=\"language-text\">\\1</code>과 같이 썼는데, 조건문에서는 단지 <code class=\"language-text\">(1)</code>로 바뀐 것입니다.</p>\n<p>예시로, <code class=\"language-text\">(a)?b(?(1)c|d)</code>를 살펴보겠습니다. 이건 <code class=\"language-text\">abc|bd</code>와 같습니다.</p>\n<ol>\n<li>먼저 <code class=\"language-text\">a</code>를 검사합니다. 만약 찾는 문자열에 ‘a’가 있으면 첫 번째 명시적 캡처에는 ‘a’가 들어가고, ‘a’가 없으면, 빈 문자열이 (1)에 저장됩니다.</li>\n<li>다음으로 <code class=\"language-text\">b</code>입니다. 만약 ‘b’가 없으면 정규식은 일치하지 않습니다. ‘b’가 있다고 가정하겠습니다.</li>\n<li><code class=\"language-text\">(?(1)c|d)</code> 이 조건문은 (1)에 값이 존재하면 c, 존재하지 않으면 d를 뜻합니다. 즉 a가 존재했었다면 <code class=\"language-text\">abc</code>가 완성되고, a가 존재하지 않았다면 <code class=\"language-text\">bd</code>가 완성됩니다.</li>\n</ol>\n<br>\n<h1>reference</h1>\n<ul>\n<li><a href=\"https://greeksharifa.github.io/\">https://greeksharifa.github.io/</a></li>\n<li><a href=\"https://wikidocs.net/4308\">https://wikidocs.net/4308</a></li>\n</ul>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"정규 표현식"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"정규표현식(regular expression)은 일종의 문자를 표현하는 공식으로, 특정 규칙이 있는 문자열 집합을 추출할 때 자주 사용되는 기법입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"주로 Prograaming Language나 Text Editor등에서 문자열의 검색과 치환을 위한 용도로 쓰이고 있습니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"메타문자"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":". ^ $ * + ? {} [] \\ | ()"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"메타문자는 문자를 설명하기 위한 문자로, 문자의 구성을 설명하기 위해 원래의 의미가 아닌 다른 의미로 쓰이는 문자를 말합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"정규표현식에서는 위와 같은 메타문자를 사용합니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"문자 클래스인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"[] 사이의 문자들과 매치\""}]},{"type":"text","value":"라는 의미를 가지며, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"사이에는 어떤 문자도 들어갈 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[abc]"}]},{"type":"text","value":"라면 이 표현식의 의미는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"a, b, c 중 한 개의 문자와 매치\""}]},{"type":"text","value":"를 뜻합니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예시) "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[abc]"}]},{"type":"text","value":"가 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"a\", \"before\", \"dude\""}]},{"type":"text","value":"와 어떻게 매치되는지 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"는 정규식과 일치하는 문자인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"가 있으므로 매치"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"before"}]},{"type":"text","value":"는 정규식과 일치하는 문자인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"가 있으므로 매치"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"dude"}]},{"type":"text","value":"는 정규식과 일치하는 문자인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a, b, c"}]},{"type":"text","value":"중 어느 하나도 포함하고 있지 않으므로 매치되지 않음"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"하이픈(-), 캐럿(^)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"하이픈(-)은 두 문자 사이의 범위(from - to)를 의미, 캐럿(^)은 반대를 의미합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a-zA-Z]"}]},{"type":"text","value":": 알파벳 모두 매치"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-9]"}]},{"type":"text","value":": 숫자 매치"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[^0-9]"}]},{"type":"text","value":": 숫자가 아닌 문자만 매치\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"안에서는 부정의 의미로 사용"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"가 없으면 문자열의 처음을 뜻함(끝은 $로 표시)"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"문자클래스"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"안에는 어떤 문자나 메타 문자도 사용할 수 있지만 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":"는 반대(not)의 의미로 사용되기 때문에 조심해야합니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\역슬래쉬"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-9]"}]},{"type":"text","value":"또는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a-zA-Z]"}]},{"type":"text","value":"와 같은 정규표현식은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\역슬래쉬"}]},{"type":"text","value":"를 이용해 간단하게 표현할 수 있습니다. 이번엔 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\역슬래쉬"}]},{"type":"text","value":"를 사용한 별도의 표기법들에 대해 알아보겠습니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\d"}]},{"type":"text","value":" - 숫자와 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-9]"}]},{"type":"text","value":"와 동일한 표현식이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\D"}]},{"type":"text","value":" - 숫자가 아닌 것과 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[^0-9]"}]},{"type":"text","value":"와 동일한 표현식이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\s"}]},{"type":"text","value":" - whitespace 문자와 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ \\t\\n\\r\\f\\v]"}]},{"type":"text","value":"와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\S"}]},{"type":"text","value":" - whitespace 문자가 아닌 것과 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[^\\t\\n\\r\\f\\v]"}]},{"type":"text","value":"와 동일한 표현식이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\w"}]},{"type":"text","value":" - 문자+숫자(alphanumeric)와 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a-zA-Z0-9_]"}]},{"type":"text","value":"와 동일한 표현식이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\W"}]},{"type":"text","value":" - 문자+숫자(alphanumeric)가 아닌 문자와 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[^a-zA-Z0-9_]"}]},{"type":"text","value":"와 동일한 표현식이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\s"}]},{"type":"text","value":" - 스페이스(공백문자), 탭과 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[\\t\\n\\f\\r]"}]},{"type":"text","value":"과 동일한 표현식이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\S"}]},{"type":"text","value":" - 스페이스 외 문자와 매치, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[^\\t\\n\\f\\r]"}]},{"type":"text","value":"과 동일한 표현식이다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"대문자로 사용된 것은 소문자의 반대임을 추측할 수 있습니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"또한 정규식 상의 특별한 의미가 있는 문자들을 문자 그대로 쓸 때 앞에 붙혀 사용됩니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: ‘Dot(.)’"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"줄바꿈 문자인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":"을 제외한 모든 문자와 매치됨을 의미합니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"다음 정규식을 보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"a.b"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"위 정규식의 의미는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"a + 모든문자 + b\""}]},{"type":"text","value":"와 같습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"즉 a와b라는 문자 사이에 어떤 문자가 들어가도 모두 매치가 된다는 의미입니다.\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"예시로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"aab\", \"a0b\", \"abc\""}]},{"type":"text","value":"를 보겠습니다.\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aab"}]},{"type":"text","value":"는 가운데 문자 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"가 모든 문자를 의미하는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"과 일치하므로 정규식과 매치됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a0b"}]},{"type":"text","value":"도 동일하게 가운데 문자 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"이 모든 문자를 의미하는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"과 일치하므로 정규식과 매치됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":"는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"와 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"사이에 어떤 문자가 존재하지 않기 때문에 위 정규식과 매치되지 않습니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"그렇다면 이 정규식은 어떨까요?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"a[.]b"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"앞서 설명드렸다 싶이 문자클래스"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"는 내부에 메타문자가 들어가더라도 문자 그대로 인식해주는 특징을 갖고 있습니다.\n따라서 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a.b"}]},{"type":"text","value":"와 매치되고 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a0b"}]},{"type":"text","value":"와 같은 문자열은 매치되지 않습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: 반복 관련 메타 문자 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"* + ? {}"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"반복(*)\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"메타문자 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있다는 의미입니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"ca*t"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"위 정규식은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c + a(0번 이상 반복) + t"}]},{"type":"text","value":"라는 것을 알 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ct"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cat"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"caaaat"}]},{"type":"text","value":" 모두 매치됩니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"반복(+)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"반복을 나타내는 또 다른 문자인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"입니다. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"과 달리 최소 1번 이상 반복될 때 사용합니다. 즉 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"은 반복횟수가 0부터 시작, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"는 반복횟수가 1부터 시작됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ct"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cat"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"caaat"}]},{"type":"text","value":"중 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ct"}]},{"type":"text","value":"는 매치되지 않습니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"반복({m,n})"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{}"}]},{"type":"text","value":"는 원하는 반복횟수를 지정하고 싶을 때 사용됩니다. m에서 n까지 반복, m이상인 경우, n이하인 경우 등 자유롭게 원하는 만큼 조절이 가능합니다.\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{m}"}]},{"type":"text","value":": 반드시 m번 반복\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ca{2}t"}]},{"type":"text","value":": “c + a(반드시 2번 반복) + t”"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{m, n}"}]},{"type":"text","value":": m~n회 반복\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ca{2, 5}t"}]},{"type":"text","value":": “c + a(2~5회 반복) + t”"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{m,}, {,n}"}]},{"type":"text","value":": m회 이상 반복, n회 이하 반복"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"반복(?)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"?"}]},{"type":"text","value":"는 반복은 아니지만 비슷한 개념으로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{0, 1}"}]},{"type":"text","value":"과 같은 의미를 지닙니다. 즉, 문자가 있거나 없거나 둘 다 매치 되는 경우입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ab?c"}]},{"type":"text","value":" : “a + b(있어도 되고 없어도 된다) + c”"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"?"}]},{"type":"text","value":"메타 문자는 모두 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{m, n}"}]},{"type":"text","value":" 형태로 고쳐 쓰는 것이 가능하지만 가급적 이해하기 쉽고 간결한 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"?"}]},{"type":"text","value":"메타 문자를 사용하는 것이 좋습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"ex) 주민등록번호 정규표현식"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"/^\\d{2}[0-1]\\d{1}[0-3]\\d{1}\\-[1-4]\\d{6}$/"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":": Start of String"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\d{3}"}]},{"type":"text","value":": 1-2번째(년도) 숫자 0-9"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-1]"}]},{"type":"text","value":": 3번째(월도 앞자리) 0,1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\d{1}"}]},{"type":"text","value":": 4번째(월도 뒷자리) 숫자 0-9"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-3]"}]},{"type":"text","value":": 5번째(일자 앞자리) 0,1,2,3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\d{1}"}]},{"type":"text","value":": 6번째(일자 뒷자리) 숫자 0-9"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\-"}]},{"type":"text","value":" : 7번째(구분자) -"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1-4]"}]},{"type":"text","value":": 8번째(성별) 90년대생 1,2 2000년대생 3,4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\d{6}"}]},{"type":"text","value":": 9-14번째(뒷자리 6자리) 숫자 0-9"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$"}]},{"type":"text","value":": End of String"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"파이썬과 정규표현식"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"파이썬은 정규 표현식을 지원하기 위해 re(regular expression)모듈을 제공합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usage"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"import re\npattern = re.compile(\"정규식\")"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"re.compile을 사용하여 정규 표현식을 컴파일합니다. re.compile의 결과인 객체 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pattern"}]},{"type":"text","value":"에 입력한 정규식의 대한 정보가 담겨있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이제 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pattern"}]},{"type":"text","value":"객체를 이용해 문자열 검색을 수행해보겠습니다. 컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공합니다.\n"},{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/59256704/133471058-446759bb-eeeb-4000-b6ef-6ca795be12df.png","alt":"image"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"import re\np = re.compile('[a-z]+')"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"위 코드를 실행해 생성된 객체 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"p"}]},{"type":"text","value":"로 메서드를 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"match"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사하며, 반환값으로 match 객체를 돌려줍니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> m = p.match(\"python\")\n>>> print(m)\n<_sre.SRE_Match object at 0x01F3F9F8>"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"문자열은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a-z]+"}]},{"type":"text","value":"정규식에 부합되므로 match 객체를 돌려줍니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"따라서 파이썬 정규식 프로그램은 다음과 같이 작성해 매치 여부를 확인합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"p = re.compile(정규표현식)\nm = p.match(문자열)\n\nif m:\n    print(\"정규식 일치\")\nelse:\n    print(\"정규식 불일치\")"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"search"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"동일하게 컴파일된 객체 p를 갖고 이번엔 search 메서드를 수행해보겠습니다. 예시를 통해 match와의 차이점을 확인해보시면 좋을 것 같습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> m = p.search(\"3 python\")\n>>> print(m)\n<_sre.SRE_Match object at 0x01F3FA30>"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"3 python"}]},{"type":"text","value":"문자열은 첫번째 문자가 숫자이므로 match메서드에서는 None을 반환합니다. 하지만 search메서드는 문자열의 처음부터 검색하는 것이 아니라 문자열 전체를 검색하기 때문에 “python”문자열과 매치돼서 match객체를 반환하게 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"findall"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"findall"}]},{"type":"text","value":" 메서드는 이름 그대로 문자열에서 정규식과 일치하는 부분을 찾아 리스트로 반환시켜줍니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> result = p.findall(\"life is too short\")\n>>> print(result)\n['life', 'is', 'too', 'short']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"정규식과 일치하는 부분인 각 단어들이 반환되는 것을 확인할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"finditer"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"finditer는 findall과 동일하지만 그 결과로 반복 가능한 객체를 돌려줍니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> result = p.finditer(\"life is too short\")\n>>> print(result)\n<callable_iterator object at 0x01F5E390>\n>>> for r in result: print(r)\n...\n<_sre.SRE_Match object at 0x01F3F9F8>\n<_sre.SRE_Match object at 0x01F3FAD8>\n<_sre.SRE_Match object at 0x01F3FAA0>\n<_sre.SRE_Match object at 0x01F3F9F8>"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"반복 가능한 객체가 포함하는 각각의 요소는 match 객체입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"match 객체의 메서드"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"계속 반환받아왔던 match객체를 써먹어야겠죠? 이번엔 match객체의 메서드들에 대해 알아보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/59256704/133474331-97272bd8-2286-45c7-b026-db5e6948cb8f.png","alt":"image"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"다음 예시로 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> m = p.match(\"python\")\n>>> m.group()\n'python'\n>>> m.start()\n0\n>>> m.end()\n6\n>>> m.span()\n(0, 6)"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예상된 결과값입니다. 만약 match메서드를 사용해 반환된 match메서드라면 start()의 결과값은 항상 0일 것입니다. match메서드는 항상 문자열의 시작부터 조사하기 때문이죠."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"만약 search 메서드를 사용했다면 start()값은 다르게 나올 것입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> m = p.search(\"3 python\")\n>>> m.group()\n'python'\n>>> m.start()\n2\n>>> m.end()\n8\n>>> m.span()\n(2, 8)"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이처럼 문자열에서 정규식이 해당되는 부분의 첫 시작지점이 나오게 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"※ 모듈 단위로 수행"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> m = re.match('[a-z]+', \"python\")"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"다음과 같이 축약된 형태로도 사용가능합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"컴파일 옵션"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"정규식을 컴파일할 때 다음 옵션을 사용할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"DOTALL(S) - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"MULTILINE(M) - 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"VERBOSE(X) - verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"옵션을 사용할 때는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.DOTALL"}]},{"type":"text","value":"처럼 전체 옵션이름을 써도 되고, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.S"}]},{"type":"text","value":"처럼 약어를 써도 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"DOTALL, S"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"메타 문자가 줄바꿈 문자"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":"도 포함시키도록 하고 싶다면 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.DOTALL"}]},{"type":"text","value":"또는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.S"}]},{"type":"text","value":"옵션을 사용해 정규식을 컴파일하면 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> p = re.compile('a.b', re.DOTALL)\n>>> m = p.match('a\\nb')\n>>> print(m)\n<_sre.SRE_Match object at 0x01FCF3D8>"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.DOTALL"}]},{"type":"text","value":"옵션으로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":"도 매치시키는 것을 확인할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"IGNORECASE, I"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.IGNORECASE"}]},{"type":"text","value":" 또는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.I"}]},{"type":"text","value":" 옵션은 대소문자 구별 없이 매치를 수행할 때 사용하는 옵션입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> p = re.compile('[a-z]', re.I)\n>>> p.match('python')\n<_sre.SRE_Match object at 0x01FCFA30>\n>>> p.match('Python')\n<_sre.SRE_Match object at 0x01FCFA68>\n>>> p.match('PYTHON')\n<_sre.SRE_Match object at 0x01FCF9F8>"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a-z]"}]},{"type":"text","value":" 정규식은 소문자만을 의미하지만 re.I옵션으로 대소문자 구별없이 매치되는 것을 볼 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"MULTILINE, M"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":"은 문자열의 처음, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$"}]},{"type":"text","value":"은 문자열의 마지막을 의미합니다. 자세한 설명 전에 다음 예시를 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"import re\np = re.compile(\"^python\\s\\w+\")\n\ndata = \"\"\"python one\nlife is too short\npython two\nyou need python\npython three\"\"\"\n\nprint(p.findall(data))"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"['python one']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과를 보면 알겠지만 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":"메타 문자에 의해 python이라는 문자열을 사용한 첫 번째 줄만 매치된 것을 알 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"하지만 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":"메타 문자를 문자열 전체의 처음이 아니라 각 라인의 처음으로 인식시키고 싶은 경우가 있을 것입니다. 이럴 때 사용하는 옵션이 바로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.MULTILINE"}]},{"type":"text","value":" 옵션입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"위 코드에 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.MULTILINE"}]},{"type":"text","value":"옵션을 추가해보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import re\np = re.compile(\"^python\\s\\w+\", re.MULTILINE)\n\ndata = \"\"\"python one\nlife is too short\npython two\nyou need python\npython three\"\"\"\n\nprint(p.findall(data))"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"['python one', 'python two', 'python three']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"다음과 같이 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":"메타 문자가 문자열의 각 줄마다 적용되는 것을 확인할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"VERBOSE, X"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"여태 봐왔듯이 정규식은 굉장히 가독성이 안좋은 것을 알 수 있습니다. 이런 정규식의 가독성을 조금이나마 해결해주기 위한 옵션이 바로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"VERBOSE"}]},{"type":"text","value":"입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);')"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"charref = re.compile(r\"\"\"\n &[#]                # Start of a numeric entity reference\n (\n     0[0-7]+         # Octal form\n   | [0-9]+          # Decimal form\n   | x[0-9a-fA-F]+   # Hexadecimal form\n )\n ;                   # Trailing semicolon\n\"\"\", re.VERBOSE)"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"첫 번째와 두 번째 예를 비교해보면 패턴 객체인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"charref"}]},{"type":"text","value":"는 모두 동일한 역할을 합니다. 하지만 두번째처럼 주석을 적고 여러 줄로 표현하는 것이 가독성이 좋은 것을 알 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.VERBOSE"}]},{"type":"text","value":"옵션은 문자열에 사용된 whitespace가 컴파일시 제거되며, #을 이용해 주석문을 달 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"백슬래시 문제"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"정규표현식을 파이썬에서 사용할 때 혼란을 주는 요소가 있습니다. 바로 백슬래시인데요."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예를들어 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\section"}]},{"type":"text","value":" 문자열을 찾기 위한 정규식을 만든다고 가정해봅시다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"우리의 의도와 달리 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\s"}]},{"type":"text","value":"문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"[ \\t\\n\\r\\f\\v]ection"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"즉 이 것과 같은 의미를 가지게 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"우리가 의도한 결과를 얻기 위해선 다음과 같이 변경해줘야 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\\\section"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"그런데 파이썬에서는 파이썬 문자열 리터럴 규칙에 따라 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\\\"}]},{"type":"text","value":"이 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\"}]},{"type":"text","value":"로 변경되어 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\section"}]},{"type":"text","value":"이 전달됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"따라서 우리가 원하는 결과를 얻기위해서 무려 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\\\\\\\"}]},{"type":"text","value":"처럼 백슬래시를 4개나 사용해야됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이러한 문제를 해결하기 위해 파이썬 정규식에는 Raw String 규칙이 생겨났습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"p = re.compile(r'\\\\section')"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"다음과 같이 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"r"}]},{"type":"text","value":"을 문자열 앞에 붙혀 Raw String임을 알려줄 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: 그룹"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"그룹화는 말 그대로 그룹으로 묶어주는 것입니다. 지금까지 사용했던 정규식들은 한 문자에만 적용됐습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> re.findall('12+', '12 1212 1222')\n['12', '12', '12', '1222']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1212"}]},{"type":"text","value":"와 같은 문자를 찾고 싶은데, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"혹은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1222"}]},{"type":"text","value":"만 찾아지는 경우입니다. 즉 메타문자 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"가 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"에만 적용된 것입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"만약 우리가 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"가 반복되는 문자를 찾고싶다면 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"를 소괄호로 그룹화 시켜주면 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"print(re.match('(12)+', '1212'))\nprint(re.search('(12)+', '1212'))\nprint(re.findall('(12)+', '1212'))\nprint(re.fullmatch('(12)+', '1212'))"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"<_sre.SRE_Match object; span=(0, 4), match='1212'>\n<_sre.SRE_Match object; span=(0, 4), match='1212'>\n['12']\n<_sre.SRE_Match object; span=(0, 4), match='1212'>"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"우리가 원하는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1212"}]},{"type":"text","value":"를 잘 찾은 것을 볼 수 있습니다.\n그런데 re.findall의 결과가 이상합니다. 어째서 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"['12']"}]},{"type":"text","value":"가 나온 것일까요??"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이는 바로 괄호가 가진 다른 기능인 캡처 때문입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: 캡처"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"캡처란 원하는 부분만을 추출하고 싶을 때 사용하는 것입니다. 예를들어 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yyyy-mm-dd"}]},{"type":"text","value":"와 같이 날짜를 나타내는 문자열 중 월, 일을 각각 따로 빼서 쓰고 싶다면 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mm"}]},{"type":"text","value":"과 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"dd"}]},{"type":"text","value":"부분에 캡처기능을 사용하면 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"print(re.findall('\\d{4}-(\\d\\d)-(\\d\\d)', '2028-07-28'))\nprint(re.findall('\\d{4}-(\\d\\d)-(\\d\\d)', '1999/05/21 2018-07-28 2019.01.01'))"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"[('07', '28')]\n[('07', '28')]"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"정규식의 내용과 일치하고, 월과 일에 해당하는 부분만 따로 빠졌음을 알 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"groups()"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"기존에 match객체에서 일치되는 문자열을 반환하는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"group()"}]},{"type":"text","value":"메서드를 알아봤었습니다.\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"group()"}]},{"type":"text","value":"과는 다르게 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"groups()"}]},{"type":"text","value":"메서드는 명시적으로 캡처("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"()"}]},{"type":"text","value":"로 감싼 부분)한 부분을 반환합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> m = re.search('\\d{4}-(\\d?\\d)-(\\d?\\d)', '1868-12-10')\n>>> print(m)\n<_sre.SRE_Match object; span=(0, 10), match='1868-12-10'>\n>>> print(m.group())\n1868-12-10\n>>> print(m.groups())\n('12', '10')"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이처럼 캡처시킨 부분을 반환시키는 것을 볼 수 있습니다. 또한 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"group()"}]},{"type":"text","value":"메서드로 부터 캡처된 내용을 추출할 수도 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"m.group(): 1868-12-10\nm.group(0): 1868-12-10\nm.group(1): 12\nm.group(2): 10\nm.groups(): ('12', '10')"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"비 캡처 그룹"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"그렇다면 그룹화를 위해 소괄호를 반드시 써야 되는데, 굳이 캡처하고 싶지는 않을 때가 있습니다. 그럴 경우에 바로 비캡쳐그룹을 사용합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"비캡처그룹은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(?:<regex>)"}]},{"type":"text","value":"와 같이 사용됩니다. 아까 원하는 결과였던 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1212"}]},{"type":"text","value":"대신 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"가 출력됐던 예제를 다시 가져와 적용시켜보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"기존 코드"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.findall('(12)+', '1212'))\n['12']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"변경 코드"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.findall('(?:12)+', '1212'))\n['1212']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이런 식으로 비 캡처 그룹을 생성시켜 원하는 결과를 얻을 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"(숫자): 앞서 일치된 문자열을 다시 비교"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"앞뒤가 똑같은 세글자 단어를 찾아봅시다. ex)토마토, ABA"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이를 위해선 조금 전 사용했던 캡처가 꼭 필요합니다. 하지만 캡처된 문자열을 접근하기 위해선 한번의 match 과정이 필요했습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"하지만 정규식 내에서 캡처된 그룹에 접근하는 방법도 존재합니다. 바로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\(숫자)"}]},{"type":"text","value":"입니다.\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\ "}]},{"type":"text","value":"이후에 등장하는 숫자번호(N)가 바로 캡처 그룹의 번호로 즉 N번째의 그룹을 재참조한다는 의미입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예시를 하나 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.search(r'(\\w)\\w\\1', '토마토 ABC aba xyxy ').group())\n토마토\n>>> print(re.findall(r'(\\w)\\w\\1', '토마토 ABC aba xyxy '))\n['토', 'a', 'x']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"첫번째는 우리가 원하는 답이지만 search는 하나밖에 찾지 못하므로 완벽한 답이 아닙니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"두번째 또한 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"()"}]},{"type":"text","value":"에 의해서 캡처 그룹만을 반환돼 우리가 원하지 않는 결과를 보입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이런 문제를 해결하기 위해서 캡처를 하나 더 만들어 줍니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.findall(r'((\\w)\\w\\2)', '토마토 ABC aba xyxy '))\n['토마토', 'aba', 'xyx']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"여기서 재참조부가 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\2"}]},{"type":"text","value":"인 이유는 우리가 참조해야될 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(\\w)"}]},{"type":"text","value":"그룹이 바깥 괄호로 인해 두번째 그룹으로 변경됐기 때문입니다.\n따라서 우리는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\1"}]},{"type":"text","value":"이 아닌 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\2"}]},{"type":"text","value":"를 입력해줘야 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이러한 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\1"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\2"}]},{"type":"text","value":"와 같은 것들을 비 명명 그룹이라고 합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"명명 그룹"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\(숫자)"}]},{"type":"text","value":"와 같은 방법은 간편하지만 눈에 잘 들어오지 않습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"많은 프로그래밍 언어의 정규표현식은 명명 그룹 기능을 지원합니다.\n언어마다 쓰는 방법이 다르지만, 파이썬 기준으로는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(?P<name>regex)"}]},{"type":"text","value":"형식으로 씁니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이번에도 예시를 하나 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"match_obj = re.match(\n    r'(?P<year>\\d{4})-(?P<month>\\d\\d)-(?P<day>\\d\\d) (?P=year)\\.(?P=month)\\.(?P=day)',\n    '2018-07-28 2018.07.28')\n\nprint(match_obj.group())\nprint(match_obj.groups())\nprint(match_obj.group(1))"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"2018-07-28 2018.07.28\n('2018', '07', '28')\n2018"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이런 식으로 기존 비명명 방식은 그룹의 번호를 지정해줘야 됐지만, 명명그룹은 하나의 변수처럼 그룹을 정의해 재참조해가며 사용할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: 치환"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"파이썬의 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":"메서드는 정규식 패턴에 대응하는 문자열을 찾아주지 못합니다. 따라서 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.sub"}]},{"type":"text","value":"메서드가 필요합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.sub(pattern='Gorio', repl='Ryan', count=2, \\\n             string='Gorio, Gorio, Gorio keep a straight face.'))\nRyan, Ryan, Gorio keep a straight face."}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.sub"}]},{"type":"text","value":"메서드의 파라미터를 살펴보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"pattern: 매치시킬 패턴 \nrepl: 변경할 문자\nstring: 적용 문자열\ncount: 치환개수(최대값)"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"번외로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.subn"}]},{"type":"text","value":"메서드는 치환된 문자열과 더불어 치환된 개수의 튜플을 반환합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"('Ryan, Ryan, Gorio keep a straight face.', 2)"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.sub"}]},{"type":"text","value":"에 이전에 보았던 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\(숫자)"}]},{"type":"text","value":"를 이용할 수도 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.sub('(\\d{4})-(\\d{2})-(\\d{2})', \n             r'\\1.\\2.\\3',\n             '1900-01-01'))\n1900.01.01"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"yyyy-mm-dd 형식을 yyyy.mm.dd 형식으로 변경됐습니다. 비명명방식이 된다면 명명방식도 가능하겠죠??"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.sub('(?P<year>\\d{4})-(?P<month>\\d{2})-(?P<day>\\d{2})',\n             '\\g<year>.\\g<month>.\\g<day>',\n             '1900-01-01'))\n1900.01.01"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: split"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.sub"}]},{"type":"text","value":"말고도 유용한 함수인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.split"}]},{"type":"text","value":"입니다. 이 메서드는 파이썬 문자열의 기본 메서드인 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"과 매우 유사합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":">>> print(re.split('<[^<>]*>',\n               '<html> Wow <head> header </head> <body> Hey </body> </html>'))\n['', ' Wow ', ' header ', ' ', ' Hey ', ' ', '']"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"정규식에 일치하는 부분을 기준으로 split이 되는 것을 볼 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: 연산을 섞은 치환"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.sub"}]},{"type":"text","value":"를 쓸 때 일치부에 나타나지도 않고, literal text에도 나타나지 않는 문자열로 치환하고 싶은 경우가 있을 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re.sub"}]},{"type":"text","value":"는 인자 repl을 받을때 함수로도 받을 수 있습니다. 함수는 인자로 match 객체를 받으며 문자열을 반환해야 합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예를 들어 소수로 표현된 숫자를 찾은다음 퍼센티지로 변환하는 것을 정규식으로 써보겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"def convert_percentage(match_obj):\n    number = float(match_obj.group())\n    return str(number * 100) + '%'\n\nprint(re.sub(pattern=r'\\b0\\.\\d+\\b',\n             repl=convert_percentage,\n             string='Red 0.250, Green 0.001, Blue 0.749, Black 1.5'))"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"결과"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"Red 25.0%, Green 0.1%, Blue 74.9%, Black 1.5"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정규표현식: 조건문"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"정규표현식도 까다롭지만 조건문을 만들어 줄 수 있습니다. 정규표현식에서의 조건문은 다음과 같습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"조건문은, 캡처 그룹을 사용해 앞에서 문자열이 일치되었는지 아닌지에 따라 다음 부분에서는 다른 일치 조건을 제시해야 할 때 쓰입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"angular2html"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-angular2html"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-angular2html"]},"children":[{"type":"text","value":"(?(숫자)맞으면|아니면)"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"여기서 숫자는 캡처와 비슷합니다. 앞에서 재참조부를 쓸 때 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\1"}]},{"type":"text","value":"과 같이 썼는데, 조건문에서는 단지 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(1)"}]},{"type":"text","value":"로 바뀐 것입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예시로, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(a)?b(?(1)c|d)"}]},{"type":"text","value":"를 살펴보겠습니다. 이건 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"abc|bd"}]},{"type":"text","value":"와 같습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"먼저 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"를 검사합니다. 만약 찾는 문자열에 ‘a’가 있으면 첫 번째 명시적 캡처에는 ‘a’가 들어가고, ‘a’가 없으면, 빈 문자열이 (1)에 저장됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"다음으로 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"입니다. 만약 ‘b’가 없으면 정규식은 일치하지 않습니다. ‘b’가 있다고 가정하겠습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(?(1)c|d)"}]},{"type":"text","value":" 이 조건문은 (1)에 값이 존재하면 c, 존재하지 않으면 d를 뜻합니다. 즉 a가 존재했었다면 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":"가 완성되고, a가 존재하지 않았다면 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bd"}]},{"type":"text","value":"가 완성됩니다."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"reference"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://greeksharifa.github.io/"},"children":[{"type":"text","value":"https://greeksharifa.github.io/"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://wikidocs.net/4308"},"children":[{"type":"text","value":"https://wikidocs.net/4308"}]}]},{"type":"text","value":"\n"}]}],"data":{"quirksMode":false}},"excerpt":"정규 표현식 정규표현식(regular expression)은 일종의 문자를 표현하는 공식으로, 특정 규칙이 있는 문자열 집합을 추출할 때 자주 사용되는 기법입니다. 주로 Prograaming Language나 Text Editor…","fields":{"readingTime":{"text":"30 min read"}},"frontmatter":{"title":"정규표현식 (regex)","userDate":"8 September 2021","date":"2021-09-08T10:00:00.000Z","tags":["nlp"],"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/ebc4f36cae54a4a8d9eea6079daca5bc/acc2d/regex.png","srcSet":"/static/ebc4f36cae54a4a8d9eea6079daca5bc/acc2d/regex.png 699w","sizes":"100vw"},"sources":[{"srcSet":"/static/ebc4f36cae54a4a8d9eea6079daca5bc/8a3ab/regex.webp 699w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.45064377682403434}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"children":[{"gatsbyImageData":{"layout":"fullWidth","backgroundColor":"#282838","images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/0d6f4/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/248f9/soohwan.png 40w,\n/static/a9e6b445142b247ee4cfa66155398bb2/fd435/soohwan.png 80w,\n/static/a9e6b445142b247ee4cfa66155398bb2/0d6f4/soohwan.png 120w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/e7f45/soohwan.webp 40w,\n/static/a9e6b445142b247ee4cfa66155398bb2/589ec/soohwan.webp 80w,\n/static/a9e6b445142b247ee4cfa66155398bb2/71a38/soohwan.webp 120w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6833333333333333}}]}}]}},"relatedPosts":{"totalCount":50,"edges":[{"node":{"id":"6529d72e-80e7-5d61-a672-d66276a3f641","excerpt":"MoE(Mixture of Experts) 기초부터 DeepSeek 혁신까지 작년 이맘때쯤 DeepSeek-V3가 저비용으로 엄청난 성능을 보이면서 화제가 되었습니다. 그 핵심 기술인 MoE(Mixture of Experts…","frontmatter":{"title":"MoE(Mixture of Experts) 기초부터 DeepSeek 혁신까지","date":"2026-01-15T01:11:55.000Z"},"fields":{"readingTime":{"text":"8 min read"},"slug":"/developed-moe/"}}},{"node":{"id":"8b49d3ef-4ce3-568c-9d71-240ff17fc3e0","excerpt":"BERT는 사실 Diffusion 모델이였다?! 최근 굉장히 흥미로운 글을 읽게되어 공유합니다. 원문 : link BERT와 Diffusion이 같은 방식이다?! NLP 연구자들에게 BERT는 너무 익숙한 모델입니다. 201…","frontmatter":{"title":"BERT는 사실 Diffusion 모델이였다?!","date":"2025-10-21T12:00:00.000Z"},"fields":{"readingTime":{"text":"8 min read"},"slug":"/bert_diffusion/"}}},{"node":{"id":"7c7e1676-ea84-58de-970c-ddec9aa10660","excerpt":"RLHF는 수다쟁이를 만든다?! (Does RLHF Breed Verbose Chatterboxes?!) RLHF(Reinforcement Learning from Human Feedback)는 OpenAI의 ChatGPT…","frontmatter":{"title":"RLHF는 수다쟁이를 만든다?! (Does RLHF Breed Verbose Chatterboxes?!)","date":"2024-03-13T01:11:55.000Z"},"fields":{"readingTime":{"text":"7 min read"},"slug":"/rlhf-vervosity/"}}},{"node":{"id":"2b9d3e22-1796-5fab-878d-5941d2e76e9d","excerpt":"LLM Paper Abstract - 2023.12 LLM…","frontmatter":{"title":"LLM Paper Abstract - 2023.12","date":"2024-01-05T10:00:00.000Z"},"fields":{"readingTime":{"text":"5 min read"},"slug":"/llm-abs-202312/"}}},{"node":{"id":"f43fa33b-917b-5c00-8462-937d99592ad7","excerpt":"What it MoE? (Mixture of Experts) 현존 최강 LLM인 GPT-4에서 “MoE (Mixture of Experts)” 방식을 채택하여 사용하고 있다고 알려졌는데요, 최근 AI계의 뜨거운 감자 Mistral AI…","frontmatter":{"title":"What is MoE? (Mixture of Experts)","date":"2023-12-22T01:11:55.000Z"},"fields":{"readingTime":{"text":"9 min read"},"slug":"/moe/"}}}]}},"pageContext":{"slug":"/regex/","prev":{"excerpt":"Streamlit The fastest way to build data apps in Python github repository: https://github.com/streamlit/streamlit tutorial: https://docs…","frontmatter":{"title":"Streamlit","tags":["toolkit","web"],"date":"2021-08-30T10:00:00.000Z","draft":null,"excerpt":"The fastest way to build data apps in Python","image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABvUlEQVQoz52Rv2sUQRTH361GxMY0FiJIsFaDiJJAbJSIWKRQFAwi/uxMYWNx2vg/2JkmCaKXICZgCiMBhYigFpJVuCNF0OTOIiRcAof7ebu3I3POHOt6hTrwZd4M7/t5b96IdFhAWyZtyofFrxJWqsFytS6Pxl7IROmVjD152dJfrSxQ9o6IMSZYLK/K5PSbYPjqPRl/OvdL/wHsXl5Zs0D5XKmefzg6I9Ozby2s23b3L8DAAqMoOpYk8dTq9437YaWWzi+ExdHx2WePp+aPTJTm7JMLf5hVtS2g4Luz52YS2/1jFGHqWw0Tlr+Z0vPX7xbel6XeSAqfwqWWJ8vIA9swYJs796pq0aRJEbS4Uls/+GWpJptbje3ek/VmgbuA48CefKLdTZrIjwhZW9+UtJl4QBfQo6o7fV57XsBZ4AowANwG+oB+4BRwSFVtsYEool9VzwGDwEnAxjeB0x7otQ84A1wELrgCNvEucA24BDxQ1RvAdQsA7gC3bJ6q9nqg/4jDwLCrPOg6PODMJ4DLNlZVe38U2A8MObB9Vd9vHbp57XZxkBnFDre37rIfkPN2dQLm40Le3Ek+P45j+QnSLFTT8pUU6wAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/46903c2153074058949ad5adb0612cc8/7fd08/streamlit.png","srcSet":"/static/46903c2153074058949ad5adb0612cc8/02626/streamlit.png 750w,\n/static/46903c2153074058949ad5adb0612cc8/bd00f/streamlit.png 1080w,\n/static/46903c2153074058949ad5adb0612cc8/fbd3b/streamlit.png 1366w,\n/static/46903c2153074058949ad5adb0612cc8/7fd08/streamlit.png 1920w","sizes":"100vw"},"sources":[{"srcSet":"/static/46903c2153074058949ad5adb0612cc8/bf0cd/streamlit.webp 750w,\n/static/46903c2153074058949ad5adb0612cc8/15fc6/streamlit.webp 1080w,\n/static/46903c2153074058949ad5adb0612cc8/2e603/streamlit.webp 1366w,\n/static/46903c2153074058949ad5adb0612cc8/24451/streamlit.webp 1920w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.5802083333333333}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADjElEQVQ4y23Oy48TdQDA8TExEaTttvSBfdHddru7bWc6bWd+8+i0u23n0SdlBRQXZGHDgiiLDwgqXjCIJEaC8cLBmHgwUU9EYzRqQuLJi/4NJB6NF+8evgbOHr7XT76SM5ix7s4QnRHnnm9yZzvBTIswN8JcP5bC67ZoWi7CdtFsn5bloZo+dSNAMYbIIqCmD6mJIVXdR3J6I7r9IQ3T59pZlW+uxzndCbPdC/HZXoq3TikowsfqBOjOmFZ7SrM9p2kfRbXn1O0jKNbsSbJ5BMnu9Gl3+qiiz4OPSvz0QRLHFGwOZH6+neLHT5YRbRerM0J0JrTas/8FZXNKzZgg2es+ZtvDdbs8+iHJl+9lWVP7OG2br26k+PvXJCfmFqoYIpwhTXtMwxpTN0coxhjFmCKbE2rGmKoYPQY9qi2fyzsq//4e5sNXi5TlLqbd5t6lPH/9kuDTG2usqgGi7dO0hzSsIXUzQDaGKGKMLEZUxZCKCJB02+PUpMH9vQwP7ybYnSxyfNrjwumA3dEiD94v8cfnK7xzWsbpujQtH9X0qBs+iuEjC5+a7lPVPSqai9SyelyYFbjkh5hqC3TkKOutLON2nkYpgtuMcT6IszdPslo8SLlcpmUH1A0XRQyQhUtNuFQ1l4o2QFI1h3OTVXbcg+grIfSVBRqlEGopgrYSRi0e4KiIse1mScSeopA/iLADmoZL3Rgg631q+oCq1qeq95FOzhQefpzn7eMpBmqcoBVj04pzwkky0eNMRYIdL8F3twusLe2nslrE6g5pGX1U8/FhD1nvUW1tUJK7SH9+n+DR1zF2vQSvH0lz88wiV45V2J1WuHqsxLXNAnuzNJdfWmK5/BylUgFhb6DZAxR9g7rpIos+Wttja2uE9M9vYb69k+DqfJErWzLOuoVqdKlpDo4jODms4zlFckuHObx4iHwuRi6fYqmYY201x/LqMrnFDNl8gRvvukhNdT9394rcOlNFMxrUhYFmW9imTEsp0mhWKC2nWSokyWSiFA7HSKcXiEb34fayyLVniUQk8rmn2drKIqlqiNcuVrh2ymQS1Nh8sc/GoMEbl7u8eb5D1yqTzkRJJsOkkiGymQVShyLE4yHWKnEq1RjpTIhmI8r2y3mkyloI38uha1n6bpVXrkw5+4LD/S/2uHnrIopaJhZ9hmQqwqHkAXJP8BDhyD46ZoWdMxOGcx/PNfECk/8AbxXdRjRliPoAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/34f77/soohwan.png 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/a94f6/soohwan.png 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png 1148w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/38420/soohwan.webp 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7470d/soohwan.webp 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/b5ef6/soohwan.webp 1148w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6829268292682927}}}}]},"fields":{"readingTime":{"text":"7 min read"},"layout":"post","slug":"/streamlit/"}},"next":{"excerpt":"Tokenization 문장에서 의미있는 단위로 나누는 작업을 라고 한다. 문자 단위 토큰화 문자 단위로 토큰화를 하는 것이다. 한글 음절 수는 모두 11,172개이므로 알파벳, 숫자, 기호 등을 고려한다고 해도 단어 사전의 크기는 기껏해야 1…","frontmatter":{"title":"Sooftware NLP - Tokenizer","tags":["nlp"],"date":"2021-09-13T23:46:37.121Z","draft":false,"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAgDBQf/xAAVAQEBAAAAAAAAAAAAAAAAAAACBf/aAAwDAQACEAMQAAABaaG4zOLfUUawY//EABkQAAMBAQEAAAAAAAAAAAAAAAQFBgMBB//aAAgBAQABBQJbRywjGljp1nxl5hJcKHAUrMVDgphq0bH5kf/EAB8RAAIBBAIDAAAAAAAAAAAAAAECAwQREyEAkRQxUv/aAAgBAwEBPwGZ1qJMiq40MhllecyN9MZWZrkWHsiw78enOzAvZHP/xAAhEQACAAQHAQAAAAAAAAAAAAABAgADEiEEERMUIkFTkf/aAAgBAgEBPwFKpS01Cx46aLKCi1gEVRl3G4xHsfkf/8QAJhAAAgIBAgYBBQAAAAAAAAAAAQIDBBEFEgATISIxQTMGMlFhYv/aAAgBAQAGPwKtp1HRa1Nr6pVkk50Mt2MFzsW4qPOeS1ghYy1gl2YuqY8vYbRDYm9GhivKG69eZG9UJnd3GZpPWFPtudc+p6L461tkVgJkn7ZmoZkXOQGOfH44AoaRp1QINw5FWFH6DPy7DIT/AEWJ98W9SlWJe9oK8ataLQoG7gzS2pIX34X46sGMe88DlTbEeJX2Fd207nU4OR07c/rxx//EABkQAQEBAQEBAAAAAAAAAAAAAAERIQAxgf/aAAgBAQABPyE1ST2K/mK0gpxFZTR0NxgkSypnBmHNuJathJRhY4BMdWSL9V/67Q+JtxJA9ymrkQvANMArqYCetMvf/9oADAMBAAIAAwAAABDTP//EABkRAQEBAQEBAAAAAAAAAAAAAAERITEAUf/aAAgBAwEBPxBS8SKEpvYqQBC18JKL2EuWBgdwz4Zv/8QAGhEBAQEBAAMAAAAAAAAAAAAAAREhMQBRgf/aAAgBAgEBPxCWB0yBU8hvAq76AAAwICFhysd+vn//xAAYEAEBAQEBAAAAAAAAAAAAAAABESEAMf/aAAgBAQABPxAbBKwQ8eg53lFdGqYyYG+bDPb0VONLCVgR3Mv6vANOz8waorF18m1M7dpSMHr7EawCJsQkOAL/2Q=="},"images":{"fallback":{"src":"/static/8e92507f0141c508e4d5a30d3ca6fe53/4d1d2/writing.jpg","srcSet":"/static/8e92507f0141c508e4d5a30d3ca6fe53/6cce3/writing.jpg 750w,\n/static/8e92507f0141c508e4d5a30d3ca6fe53/fb319/writing.jpg 1080w,\n/static/8e92507f0141c508e4d5a30d3ca6fe53/6a5de/writing.jpg 1366w,\n/static/8e92507f0141c508e4d5a30d3ca6fe53/4d1d2/writing.jpg 1400w","sizes":"100vw"},"sources":[{"srcSet":"/static/8e92507f0141c508e4d5a30d3ca6fe53/d2a19/writing.webp 750w,\n/static/8e92507f0141c508e4d5a30d3ca6fe53/72f43/writing.webp 1080w,\n/static/8e92507f0141c508e4d5a30d3ca6fe53/8992a/writing.webp 1366w,\n/static/8e92507f0141c508e4d5a30d3ca6fe53/d652b/writing.webp 1400w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6678571428571428}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADjElEQVQ4y23Oy48TdQDA8TExEaTttvSBfdHddru7bWc6bWd+8+i0u23n0SdlBRQXZGHDgiiLDwgqXjCIJEaC8cLBmHgwUU9EYzRqQuLJi/4NJB6NF+8evgbOHr7XT76SM5ix7s4QnRHnnm9yZzvBTIswN8JcP5bC67ZoWi7CdtFsn5bloZo+dSNAMYbIIqCmD6mJIVXdR3J6I7r9IQ3T59pZlW+uxzndCbPdC/HZXoq3TikowsfqBOjOmFZ7SrM9p2kfRbXn1O0jKNbsSbJ5BMnu9Gl3+qiiz4OPSvz0QRLHFGwOZH6+neLHT5YRbRerM0J0JrTas/8FZXNKzZgg2es+ZtvDdbs8+iHJl+9lWVP7OG2br26k+PvXJCfmFqoYIpwhTXtMwxpTN0coxhjFmCKbE2rGmKoYPQY9qi2fyzsq//4e5sNXi5TlLqbd5t6lPH/9kuDTG2usqgGi7dO0hzSsIXUzQDaGKGKMLEZUxZCKCJB02+PUpMH9vQwP7ybYnSxyfNrjwumA3dEiD94v8cfnK7xzWsbpujQtH9X0qBs+iuEjC5+a7lPVPSqai9SyelyYFbjkh5hqC3TkKOutLON2nkYpgtuMcT6IszdPslo8SLlcpmUH1A0XRQyQhUtNuFQ1l4o2QFI1h3OTVXbcg+grIfSVBRqlEGopgrYSRi0e4KiIse1mScSeopA/iLADmoZL3Rgg631q+oCq1qeq95FOzhQefpzn7eMpBmqcoBVj04pzwkky0eNMRYIdL8F3twusLe2nslrE6g5pGX1U8/FhD1nvUW1tUJK7SH9+n+DR1zF2vQSvH0lz88wiV45V2J1WuHqsxLXNAnuzNJdfWmK5/BylUgFhb6DZAxR9g7rpIos+Wttja2uE9M9vYb69k+DqfJErWzLOuoVqdKlpDo4jODms4zlFckuHObx4iHwuRi6fYqmYY201x/LqMrnFDNl8gRvvukhNdT9394rcOlNFMxrUhYFmW9imTEsp0mhWKC2nWSokyWSiFA7HSKcXiEb34fayyLVniUQk8rmn2drKIqlqiNcuVrh2ymQS1Nh8sc/GoMEbl7u8eb5D1yqTzkRJJsOkkiGymQVShyLE4yHWKnEq1RjpTIhmI8r2y3mkyloI38uha1n6bpVXrkw5+4LD/S/2uHnrIopaJhZ9hmQqwqHkAXJP8BDhyD46ZoWdMxOGcx/PNfECk/8AbxXdRjRliPoAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/34f77/soohwan.png 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/a94f6/soohwan.png 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png 1148w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/38420/soohwan.webp 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7470d/soohwan.webp 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/b5ef6/soohwan.webp 1148w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6829268292682927}}}}]},"fields":{"readingTime":{"text":"10 min read"},"layout":"post","slug":"/tokenizer/"}},"primaryTag":"nlp"}},
    "staticQueryHashes": ["3170763342","3229353822"]}