[Powered by Google Translate] [세미나 : 정규 표현식을 사용한 패턴 매칭] [존 Mussman 하버드 대학교] [이것은 CS50.-CS50.TV] 좋아요. 물론, 모두 환영합니다. 이 CS50 2012입니다. 내 이름은 존입니다, 나는 정규 표현식에 대해 오늘 이야기 할 것입니다. 정규 표현식은 주로 도구이지만, 또한 때때로 사용 코드에서 적극적으로 기본적으로 패턴과 문자열을 만들어보세요. 그래서 여기 XKCD에서 웹 만화입니다. 이 만화에서 범인이 살인 미스터리가 휴가 누군가를 따라하고, 주인공해야만 주소 확인 이메일 200메가바이트를 통해 검색 할 수 있습니다. 그리고 그들은 정규 표현식을 아는 경우 사람을 포기하려고합니다 - 아마도 슈퍼 히어로 - 급습 아래 몇 가지 코드를 작성 과 살인 미스터리를 해결합니다. 그래서 아마도 그건 당신이 어떻게 할 수있는 권한 뭔가 될 것입니다 이 세미나 후. 우리는 단지 언어 간결한 소개를 제공하려는 그리고 당신에게 당신의 자신에 더 많은 자원 후에 갈 충분한 자금을 제공합니다. 따라서 정규 표현식은 다음과 같이 기본적보세요. 이 루비 정규 표현식입니다. 그것은 언어를 통해 정말 차이가 없습니다. 우리는 루비 정규 표현식을 시작하고 표시하는 것만 슬래시에있다. 이 이메일 주소 패턴을 찾기 위해 정규 표현식입니다. 그래서 우리는 첫 번째 비트에 영숫자 문자를 찾습니다 참조하십시오. 이메일 주소는 종종 알파벳 문자로 시작해야하기 때문이다. 그리고 모든 특수 문자는 @ 기호 다음에. 그리고 도메인 이름 같은 것. 그리고 2 사이 4 자 그래서 그물.,. com을 찾아하고 있습니다. 그래서이 정규 표현식의 또 다른 예입니다. 따라서 정규 표현식은 텍스트에 재잘 거림을 찾기위한 프로토콜입니다. 그들은 비교, 선택 및 교체를한다. 디렉토리에 54로 끝나는 모든 전화 번호를 찾는 세 번째 예 그래서. 그래서 CS50 디렉토리까지 데이비드 입술 전에 우리가 검색 할 수 우리는 괄호를 패턴은 다음 3 개의 숫자는 괄호를 종료 3 개 이상의 숫자, 대시, 2 개의 숫자, 그리고 54. 그리고 그 우리가 검색 할 정규 표현식을 마련하는 방법 본질적 될 것입니다. 그래서 거기 - 우리는 CS50에 몇 가지를 수행 한처럼 조금있다 그 그래서 정규 표현식, - 예를 들어 - dictionary.C 파일 맞춤법 검사 문제 세트는 fscanf를 사용했을 수 있습니다 사전에서 단어 읽을 수 있습니다. 그리고 당신은 백분율 45 초 45 문자의 문자열을 찾고있다 볼 수 있습니다. 그래서 기본적인 정규 표현식과 같은 약간이다. 그리고 당신은 거기에 법안에 맞게 모든 45 문자를 사용할 수 있습니다 그 업을 선택합니다. 가장 최근의 웹 프로그래밍 문제와 두 번째 예제 PHP의 배포판 코드에서 설정 우리가 실제로 간단한 정규 표현식이 있습니까. 이 사람은 단지 웹 페이지가 전달됩니다 있는지 확인하기 위해 찾고 있습니다 하나 로그인을 일치하거나 등록 로그 아웃. PHP를. 그리고 그 다음 정규 표현식 매칭에 따라 true 또는 false를 반환. 그래서 때 정규 표현식을 사용합니까? 왜 여기 오늘? 뭔가가있을 때 그래서 당신은 정규 표현식을 사용하지 않으려면 더 쉽게 당신을 위해 작업을 수행합니다. 그래서 XML과 HTML은 꽤 까다로운 우리는 조금의 볼과에 대해 정규 표현식을 쓸 수 있습니다. 그래서 그 언어를위한 전용 파서가 있습니다. 당신은 또한 자주 장단점 및 정확도 괜찮해야합니다. 당신이 시도하는 경우 - 그래서 우리는 전자 메일 주소에 대한 정규식을 보았다 하지만 당신은 특정 전자 메일 주소를 원하고 점차적으로 말 보다 정확한되면서 정규 표현식은 복잡한 될 수 있습니다. 그래서 하나의 트레이드 오프 될 것입니다. 당신은 괜찮 정규 표현식으로하고 있는지 확인해야합니다. 당신은 당신이 찾고있는 정확히 알고 있다면 그것은 더 많은 감각을 만들 수도 있습니다 시간을두고 더 효과적인 파서를 작성 해주세요. 그리고 마지막으로 규칙과 역사 문제가 있습니다 표현과 언어. 정규 표현식은 실제로 훨씬 더 강력한보다 당 정규 표현식은 공식적인 의미에서 말한다. 그래서, 형식적인 이론에 너무 멀리 가고 싶지 않아 그러나 대부분의 언어는 우리가 실제로의 코드는 일반 아니라는 것을. 정규 표현식은 때로는 모두 안전한 것으로 간주되지 않습니다 이유 때문입니다. 그래서 기본적으로 언어에 대한 촘스키 계층 구조가있다 정규 표현식은 조합, 연결을 사용하여 구축된다 그리고 우리는 몇 분 Kleene 별 작업을 볼 것이다. 당신이 관심이 있다면 이론적으로 후드가 벌어 꽤 많이있다. 연혁 그래서 - 여기 컨텍스트 - 일반 세트가 등장했습니다 1950 년대에, 그리고 우리는 간단한 편집기를했다 정규 표현식을 통합 - 그냥 문자열을 검색. 그렙 - 이는 명령 줄 도구는 - 최초의 중 하나 1960 년대에 정규 표현식을 포함하는 매우 인기있는 도구를 제공합니다. 80 년대, 펄이 내장 된 - 프로그래밍 언어입니다 아주 눈에 띄게 정규 표현식을 포함합니다. 그리고 최근에 우리는 펄 호환 정규 표현식을 가지고있다 기본적으로 동일한 구문을 많이 사용하는 다른 언어로 프로토콜을 지원합니다. 물론 가장 중요한 사건은 2008 년에 있었다 여기서 첫 번째 국가 정규식 날이 있었다 당신이하는을 축하하려는 경우 어떤 I는 6월 1일 생각합니다. 여기에 다시, 단지 조금 더 이론. 따라서 정규 표현식을 구성하는 몇 가지 방법이 있습니다. 한 가지 간단한 방법은 당신이하려고하는 식을 작성하는 것입니다 해석 문자열에서 실행 - 기본적으로하는 미니 프로그램을 조금 구축 문자열의 조각을 분석하고 볼 수 있습니다, "아,이 정규 표현식에 맞게하거나하지 않는 이유는 무엇입니까?" 그리고 그 다음을 실행합니다. 당신은 아주 작은 정규 표현식이있는 경우에는,이 아마 그것을 할 수있는 가장 효율적인 방법입니다. 그리고 당신 경우 - 다른 옵션을 재구성 유지하는 것입니다 표현 당신은 가고, 그 시뮬레이션의 가능성 때문입니다. 그리고 정규 표현식 알고리즘에서 이러한 초기 시도는 있었다 비교적 간단하고 비교적 빠르다, 그러나 많은 유연성을 가지고 있지 않았다. 그래서 몇 가지 우리가 보는가는 것을도 있어요 오늘 우리는보다 복잡한 정규 표현식을 수행해야했다 잠재적으로 훨씬 느린 구현, 명심 뭔가가되도록 공격 다양한 정규 표현식 거부도 있습니다 이러한 새로운 구현을위한 잠재력을 활용하는 매우 복잡하게하는 정규 표현식. 그리고 우리는 버퍼 오버 플로우 공격에서 보았던 것과 같은 의미에서, 당신은 일이 재귀 루프를 만들어서 공격이 메모리의 용량을 오버런. 그리고 방법에 의해 Regexen는 정규 표현식의 공식 복수형 중 하나입니다 앵글로 색슨의 소에 비유 있습니다. 좋아, 그래서 파이썬 라이브러리 사람 여기에 당신이 많은 맥이, 그래서 당신은 실제로 화면에이 당겨 수 있습니다. 정규 표현식은 파이썬에 내장되어 있습니다. 그래서 파이썬은이 링크에서 맥과도 온라인에 사전로드되어 있습니다. 당신이보고되는 경우에 일시 정지하고 파이썬을 확인하실 수 있습니다 우리는 여기서 연주. 당신은 당신의 컴퓨터에 파이썬을 입력 그렇다면 온라인 매뉴얼이있다 당신은 버전이 단말기 등장 것을 볼 수 있습니다. 그래서 나는 파이썬의 버전 2뿐만 아니라 컨닝 페이퍼에 대한 설명서 링크를 제공. 거기에 파이썬의 버전 3이지만, 맥은 반드시하지 않습니다 사전로드가 포함되어 있습니다. 그래서 정말 차이가 없습니다. 좋아, 그럼 파이썬에서 정규식을 사용하는 몇 가지 기본 사항. 그래서 나는 여기있는 매우 간단한 표현을 사용, 그래서 파이썬 가져 오기 다시 한 다음에 re.search의 결과를했습니다. 그리고 검색이 인수를 사용합니다. 첫 번째는 정규 표현식이고, 두 번째는 텍스트입니다 또는 분석 할 문자열입니다. 그리고 나서 result.group을 인쇄했습니다. 그래서이 오늘날 우리가 보게 될 2 기본 기능입니다 정규 표현식에 대해 학습합니다. 그래서 그냥이 정규 표현식은 여기에 분해 H하고 \ w 다음은 M 있도록 \ w는 그냥 거기에있는 모든 알파벳 문자를 사용할 수 있습니다. 그래서 여기에 우리는 또 다른 알파벳 문자 "H"를 찾고 그리고있다 그리고 M은, 그래서 여기에 햄과 일치하는 것 에서, "아브라함 링컨과 햄 샌드위치입니다." 이것은 그룹의 결과입니다. 우리가 할 수있는 또 다른 것은 파이썬에서 텍스트의 우리의 이전 문자열을 사용하는 것입니다. 그래서 내가 가서 여기에 그를 끌어 같아요. 파이썬 다시 가져 오기. 그리고 같은 일을 수행하는 경우 - 우리가 텍스트라고하자 "아브라함은"우리는 확대하자 - 거기 우리는 간다. 텍스트는 "아브라함이 햄 먹는다."입니다 좋아, 다음 =에 re.search를 결과. 그리고 우리의 표현이 시간이 될 수 있습니다, 그리고 난 점 M을 할 것입니다. 그래서 점은 숫자를 포함하는 새로운 라인이 아닌 모든 문자를 걸립니다 백분율 기호, 그런 건. 그리고 텍스트 - 붐 - 그리고 result.group - 그래. 그래서 여기에 기본적인 기능을 구현하는 단지 방법이다. 미친 텍스트 - - 우리가 텍스트 링이 있다면 다시 슬래시 많은 말을 포함 및 내부 문자열 이스케이프 시퀀스처럼 보일 수 것들 그때 우리는 아마 허용되어 있는지 확인하는 원시 텍스트 입력을 사용하고 싶습니다. 그리고 그냥 그렇게 보인다. 우리가 거​​기에 각각 찾고 있었다 그래서 만약 우리가 아무것도 찾을 수 없습니다. 그러나 당신이 그것을 구현하는 방법입니다 직전의 문자열 정규 표현식 당신은 문자 R을 넣어. 좋아, 그럼 우리가 계속하자. 오른쪽 모두 - 그렇게 우리는 여기에 몇 가지 반복적 인 패턴을 살펴 보자. 그래서 당신이하고 싶은 한 가지 일을 수생입니다 당신은 텍스트를 검색하는 등. 따라서 B의 숫자를 따라 수행 방법 - 당신의 ab *을 수행하십시오. 그리고 다른 일련의 규칙도있다. 그리고 당신이 최대를 모두 볼 수 있으며, 난 그냥 일부를 통해 실행됩니다 가장 일반적으로 사람을 사용했다. 그래서 AB +는 모든 N B의 0보다 큰옵니다. AB? 인 B의 0 또는 1로 따랐다. AB {N}는 B의 N 다음, 다음 등이다. 당신은 중괄호 2 번호가 있다면 당신은 범위를 지정하는 그 가능성이 일치 할 수 있습니다. 그래서 우리는 분 몇 반복적 인 패턴을 더 볼 것이다. 그래서 여기에 도구를 이러한 패턴 일치를 사용할 때 명심해야 할 2 가지. 우리의 HM보고 싶지 그렇게 말씀, "에이브 러햄 링컨 햄 샌드위치를​​ 만든다." 그래서 아브라함 에이브 러햄 링컨의 이름을 변경했습니다. 그리고 지금 우리는이 검색 기능에 의해 반환되는 것을 찾고 있습니다 그리고는이 경우에 햄을 반환합니다. 그리고 검색 자연스럽게 가장 왼쪽 큐를 소요하기 때문 않습니다. 그리고 당신은 달리 지정하지 않는 한 모든 정규 표현식은 그렇게 할 것입니다. 우리 모두를 찾을하려는 경우 해당하는 기능이있다 - 모두를 찾을 수 있습니다. 그래서 그냥 = re.findall ( 'h.m'텍스트)처럼 보이게 수있는 다음 () all.group. 모두 햄과 햄을 모두 생산하고 있으며, 각 햄이 경우 모두 아브라함의 문자열. 그래서 또 다른 옵션입니다. 좋아요. 명심해야 할 또 다른 점은 정규 표현식은 직관적으로 가장 큰 걸릴 것입니다. 우리는이 예를 살펴 보자. 우리는 여기서 그 가장 왼쪽에 검색을했고, 그때 큰 검색을 시도 클린의 별 (Kleene star) 연산자를 사용. 그래서 들어, "아브라함 링컨, 햄 샌드위치를​​ 만들어"나는 단지 돌아왔다 결과로 m. 그 실수에 대한 이유는 나는의 번호를 촬영 한 수 있었다 나는 H와 M 사이에서 갈 아무것도 지정하지 않았기 때문에 시간이다. M이 있던 유일한 예 - 그것은 m에 함께가 유일한 사례 와 H의 임의의 수의 단지 문자열 M이었다. 그럼 난 다시 그것을 시도, 나는 말했다, "그래, 우리는 여기에 실제 큰 그​​룹을 방문하세요." 그리고 나는 H를했다. * m, 단지 H와 M 사이의 문자 수를 반환하도록. 그리고 당신은 다만 밖으로 시작하고 좋아요,이, "아, 할 생각을하면 저에게 햄을, "실제로 아브라함 링컨 H에서 모든 소요 햄의 끝에 모든 방법. 그것은 욕심, 그것은 시간을보고 -이 모든 다른 텍스트 - M, 그리고 그것이 안으로 걸리는 것입니다 이것은 특히 중대한 사안입니다 - 이것은 우리가 또한 할 수있는 기능입니다 그것은 다른 함수를 사용하여 욕심을 위해 지정합니다. 그러나 이것은 우리가 특히 명심해야 할 일이있다 HTML 텍스트를 볼 때, 그 이유 중 하나입니다 정규 표현식은 HTML에 대한 어렵습니다. 때문에 중간에 HTML 열린 태그와 다음 물건을 많이 가지고있는 경우 그리고 다른 HTML은 프로그램에서 훨씬 나중에 태그를 폐쇄 당신은 아마도 실수로 귀하의 HTML 코드를 많이 먹었어요. 좋아요 - 그래서 더 많은 특수 문자, 많은 다른 언어처럼, 우리는 슬래시를 사용하여 이스케이프. 그래서 우리는 새로운 라인을 제외한 모든 문자를 지정하는 점을 사용할 수 있습니다. 우리는 어떤 알파벳 문자를 지정할 탈출 W를 사용할 수 있습니다. 어떤 정수 비유 탈출 D 님 - 수치 문자입니다. 우리는 지정할 수 있습니다 - 우리는 관련 식을 지정하는 브래킷을 사용할 수 있습니다. 그래서 이것은 A, B 또는 C를 받아 들일 것입니다. 우리는 또한 지정하거나 또는 B 중 하나에 대한 옵션 수 있습니다. - 예를 들어, 우리는 여러 가능성을 찾고있는 경우 괄호 안에 우리와 같이 OR 연산자를 사용할 수 있습니다 - 그래서 우리가 여기이 예제로 돌아가 보자. 다음 우리가 여기이 예제로 돌아가 보자, 그리고 - 그리고 지금 우리가 보자 AE을 - 그래서 이것은 반환해야합니다 -이 아직도 아브라함 것 같아요. 이 때문에 - 우리 모두 할 경우 - 큰. 그래서 우리가 여기에 텍스트를 업데이트 할 수 있습니다. "그의 감치 동안 아브라함은 햄을 먹고 -. 잡기 동안" 좋아요. 모든. 좋아요. 이제 우리는 햄, 햄, 그리고 단을 얻는다. 인연 동안 - 그 콧노래 동안 - 단 그 하십시요 콧노래 동안. 좋아요. 그런 것 같아요. 이제 모든 잡음 또는 그를 데리러하지 않고 여전히, 햄, 햄, 그리고 단 반환합니다. 큰 - 우리는 하나를보고 싶으면 그래서 그걸 - 우리는 할 수 그 사람이나 - 우리는 돌아올 것이다. 좋아요 - 너무 - 좋아 - 위치에 당신은 또한 캐럿 또는 달러 기호를 사용할 수 있습니다 당신이 시작 무언가 또는 문자열의 끝 찾고있는 지정합니다. 또는 시작 또는 단어의 끝. 그것은이를 사용하는 한 가지 방법입니다. 좋아요 - 그래서 우리는 텍스트의 약간 큰 블록 놀러 할 수 있습니다. 우리는 여기에이 행을 가정 해 봅시다 -이 문을 여기에. 정규 표현식의 힘은 패턴을 지정할 수 있다는 것입니다 그냥 문자를 고정하지. 우리가 만들자 - 우리가이 블록을 호출 할 수 있습니다. 그 다음 우리는 안으로 모두를 읽 그리고이 - 우리 모두 =를 만들어 보자, 우리가 수익성 여기에서 검색 할 수있는 몇 가지 그래서 무엇입니까? 우리는 표현의 귀를 찾을 수 있습니다. 그다지 재미. 방법에 대해? 우리는 어떻게 볼 수 있습니다. 나는 그것을 문제를 주었다. 그래서 다시 모든 이전에 일의 수. 그래서 처음부터 최대 아마도 모두 다시 몇 번에 모두를 반환해야합니다. 그리고 여기에 우리가 정규 표현식의 힘이있다 그들이 패턴을 지정할 수 있습니다 여기에 문자뿐만 아니라이다. 그래서 위로 최종 다시 모든 방법은, 그것은 가장 왼쪽에 시작 욕심이었다. 우리가 보자 - 우리는 당신을위한 다른 어떤 볼 수 있었다. 당신이 대명사를 찾고에 관심이 있다면 내가 한 가지를 추측 그녀와 그, 당신의 0 또는 1에 해당되는 확인 수 그리고 표정은 그가, 그리고 그 아마 반환하지 않을 것입니다 - 오, 난 거기에 우리가 여기, 힘, 그 날에 있습니다 찾고 있기 때문에 그 반환 같아요. 우리가이 일의 시작에 와야하도록 지정 해보자. 그 오프 인하의 경우 우리가 보자. 그래서 우리는 지방을 할 수 있고, 거기에 우리가 아무것도하지 않기 때문에 그녀와 그 이 문구에서 발생하지 않습니다. 좋아요. 좋아요 - 그래서 다시 고양이 여기에. 그래서 복잡한 패턴은 뇌를 아프게합니다. 우리는 이러한 문제를 방지하기 위해 정규 표현식을 사용하는 이유 그래서입니다. 그래서 여기 당신과 함께 놀러 할 수있는 몇 가지 다른 유용한 모드입니다. 오늘날 우리는 검색에 보였다, 그러나 당신은 또한 일치, 분할,별로 findAll 및 그룹을 사용할 수 있습니다. 당신은 단지 외에 정규 표현식으로 할 수 있도록 다른 멋진 것들 패턴을 찾고 패턴을 복용하고 모든 경기를 잡고 - 그 변수 - 그리고 나중에 코드에서 사람들을 사용. 그것은 매우 도움이 될 수 있습니다. 다른 일들이 계산 될 수 있습니다. 그래서 우리는 정규식 패턴의 인스턴스의 수를 셀 수 있습니다 그리고 그 우리가 그룹을 사용할 수 있습니다 것입니다. 다른 모드도 가능합니다. 그래서 난 그냥 당신이 정규 표현식을 사용할 수있는 다른 방법에 대해 조금 더 이야기하고 싶다. 그래서 한 번 더 고급 응용 프로그램은 퍼지 매칭입니다. 당신은 표현, 율리우스 카이사르에 대한 텍스트를 찾고 있습니다 그렇다면 그리고 당신은 다른 언어로 가이우스 율리우스 카이사르 또는 이름 줄리어스 시저 중 하나를 참조하십시오 당신은 또한이 값에 약간 무게를 할당 할 수 있습니다. 그리고 그것은 충분히 가까이있는 경우 - 그것은 특정 임계 값을 교차하는 경우 - 그럼 당신이 원하는 율리우스 카이사르를 받아 들일 수 있습니다. 그래서뿐만 아니라 몇 가지 다른 언어 그것에 대해 몇 가지 다른 구현이 있습니다. 쉽고 간단한 응용 프로그램에 대한 온라인 - 여기에 몇 가지 다른 도구, 정규식 팔은 귀하의 정규 표현식이 올바르게 구성되어 있는지 확인합니다. 바탕 화면에서 실행할 수있는 독립형 도구도 있습니다 울트라 피코, 그리고뿐만 아니라, 그냥 요리 책처럼. 당신은 정규 표현식의 톤을 포함하는 프로젝트를하고 있습니다 그래서 만약 이것은 아마도 오늘날의 범위에 갈 수있는 장소입니다. 그리고 당신에게 그것이 얼마나 공통의 감각을주는 GREP 유닉스있어, 펄이 내장되어 있습니다, 그리고 C C.에 대한 PCRE가 그리고 모든 다른 언어는 정규 표현식 패키지를이 그것은 우리가 오늘날의 맛을 가지고 본질적으로 동일한 구문을 사용하여 작동합니다. PHP, 자바, 루비, 등등. Google 코드 검색은 실제로 언급 할 가치이며 그것은 중 하나입니다 대중에 액세스 할 수 있습니다 거기에 상대적으로 적은 응용 프로그램 정규 표현식을 사용하여 데이터베이스입니다. 당신이 Google 코드 검색에 보면 그래서 만약 당신이 코드를 찾을 수 있습니다 이 기능을 사용하는 방법을의 인스턴스를 찾고 있다면, 당신은 다른 모든 종류의 경우에 사용되는 해당 기능을 찾을 정규 표현식을 사용할 수 있습니다. 당신은 fwrite 같은을 찾을 수 있으며 당신은 쓰기의 깃발을 찾아 읽거나 수 당신이 경우에 사용되는 fwrite 같은의 예제를 원한다면. 여기에 그래서 같은이 것, 그리고 몇 가지 참조입니다. 이 때문에 앞으로 갈뿐만 아니라, 온라인이 될 것입니다 당신은 파이썬, GREP, 펄에서보고 싶어 - 당신은 영감을 얻으려면 여기에 이​​론에서 더보고 싶은 경우 나 장소에 떨어져 좋은 점프입니다. 정말 감사합니다. [CS50.TV]