[Powered by Google Translate] [Seminarium: wzorzec dopasowania wyrażeń regularnych] [John Mussman-Harvard University] [To jest CS50.-CS50.TV] Okay. Cóż, witajcie wszyscy. To CS50 2012. Nazywam się John, a ja będę mówić dzisiaj o wyrażeniach regularnych. Wyrażenia regularne to przede wszystkim narzędzie, ale także czasami używane w kodzie aktywnie zasadniczo dopasować wzory i smyczki. Więc oto komiks internetowy z XKCD. W tym komiksie nie jest tajemnica morderstwa, w którym morderca ma po kogoś na wakacjach, a bohaterowie muszą przeszukiwać 200 megabajtów maili szukają adres. A są one o rezygnacji, kiedy ktoś, kto zna wyrażeń regularnych - przypuszczalnie superhero - swoops dół i pisze jakiś kod i rozwiązuje zagadkę morderstwa. Więc prawdopodobnie to będzie coś, co będzie do tego upoważnione po tym seminarium. Jesteśmy po prostu będzie zwięzłe wprowadzenie do języka i daje wystarczająco dużo środków, by przejść po więcej środków na własną rękę. Więc wyrażenia regularne wygląda w zasadzie tak. To wyrażenie regularne w Ruby. To nie jest strasznie różni się w różnych językach. Mamy tylko na ukośniki, aby rozpocząć i zaznaczyć wyrażenia regularnego w Ruby. I to jest wyrażenie regularne szukać w strukturze adresu e-mail. Widzimy więc, w pierwszym trochę wygląda na dowolny znak alfanumeryczny. To dlatego, że adresy e-mail często zacząć z liter alfabetu. I wtedy każdy znak specjalny, a następnie symbolu @. A potem to samo dla nazwy domeny. A potem od 2 do 4 znaków szukać. Com. Net, i tak dalej. Więc to jest kolejny przykład wyrażenie regularne. Więc wyrażenia regularne są protokoły znalezienie wzorach w tekście. Robią porównań, wybory, i wymiany. Więc Trzecim przykładem jest znalezienie wszystkie numery kończące się 54 w katalogu. Więc przed RIP David górę CS50 katalogu możemy sprawdzić wzór, gdzie mamy nawiasy następnie 3 numery, a następnie zakończyć nawias, 3 więcej numerów, myślnik, 2 numery, a następnie 54. I to byłoby w istocie, jak wymyślić wyrażeń regularnych do wyszukiwania za to. Tak więc istnieją - zrobiliśmy kilka rzeczy w CS50, że są trochę jak wyrażenia regularne, więc - na przykład - w dictionary.C pliku do sprawdzania pisowni zestawu problemu może użyłeś fscanf przeczytać w słowa ze słownika. I widać 45s procent szuka ciąg 45 znaków. Więc to jest trochę jak prymitywny wyrażenie regularne. A może masz jakieś 45 znaków, które pasują tam rachunek i wybrać te góry. A potem drugi przykład w ostatnim problemie programowania WWW ustawić w kodzie distro dla PHP rzeczywiście mają proste wyrażenie regularne. A ten jest po prostu chce sprawdzić, czy strona internetowa, która jest przekazywana pasuje zarówno zalogowaniem lub wylogowaniem się zalogować. PHP. A potem powrót prawdziwe lub fałszywe na podstawie tej zgodności wyrażenia regularnego. Więc jeśli używasz wyrażenia regularnego? Dlaczego tu jesteś dzisiaj? Więc nie chcę użyć wyrażenia regularnego, gdy jest coś, co nie praca dla Ciebie jeszcze łatwiejsze. Więc XML i HTML są rzeczywiście bardzo trudne pisać wyrażenia regularne, jak zobaczymy w trochę. Tak więc są dedykowane parsery dla tych języków. Musisz także być w porządku z kompromisów i dokładność często. Jeśli próbujesz - tak widzieliśmy wyrażenia regularnego na adres e-mail, ale że chcesz konkretny adres e-mail i stopniowo Wyrażenie regularne może stać się bardziej złożone, jak stało się bardziej precyzyjne. Tak, że będzie jeden kompromis. Musisz być pewien, że jesteś w porządku co do wyrażenia regularnego. Jeśli wiesz dokładnie, co szukasz to może więcej sensu umieścić w czasie i napisać bardziej efektywne parser. I jest wreszcie historyczny problem z regularnością wyrażeń i języków. Wyrażenia regularne są w rzeczywistości o wiele więcej możliwości niż wyrażenia regularne na powiedzieć w sensie formalnym. Więc nie chcę iść za daleko w formalną teorią, ale większość języków, że kod w rzeczywistości nie są prawidłowe. I dlatego wyrażenia regularne czasami nie są uważane za wszystko, co bezpieczne. Więc w zasadzie nie ma hierarchii Chomsky o językach, i wyrażenia regularne są budowane przy użyciu zjednoczenie, konkatenacji, i działanie gwiazda Kleene, że zobaczymy się w ciągu kilku minut. Jeśli jesteś zainteresowany w teorii jest dość dużo się dzieje tam pod maską. Tak krótkiej historii - tylko dla kontekście tutaj - regularne zestawy wpadł w 1950 roku, a następnie mieliśmy proste edytory, że włączone wyrażeń regularnych - po prostu szukają strun. Grep - który jest narzędziem wiersza poleceń - był jednym z pierwszych bardzo popularne narzędzia, które włączone wyrażeń regularnych w 1960 roku. W latach 80-tych, Perl został zbudowany - to język programowania, który zawiera wyrażenia regularne, bardzo wyraźnie. A potem ostatnio mieliśmy wyrażenie regularne Perla protokołów w zasadzie w innych językach, które używają dużo tej samej składni. Oczywiście najważniejszym wydarzeniem w 2008 roku było gdzie był pierwszy Narodowy Dzień Wyrażenia regularne, które uważam to czerwiec 1. Jeżeli chcesz, aby świętować to. Ponownie, tylko trochę bardziej teoria tutaj. Tak więc istnieje kilka różnych sposobów konstruowania wyrażeń regularnych. Jednym z prostszych sposobów jest budowanie wypowiedzi, które będą działać na ciąg interpretacji - w zasadzie zbudować mały mini-program, który przeanalizuje kawałki łańcucha i zobaczyć, "Oh, czy to pasuje do wyrażenia regularnego, czy nie?" A następnie uruchom to. Więc jeśli masz bardzo małą wyrażenia regularnego, to prawdopodobnie Najbardziej skutecznym sposobem, aby to zrobić. A jeśli ty - innej opcji jest utrzymanie rekonstrukcji Wyrażenie as you go, i że jest możliwość symulacji. I te wczesne próby regularnych algorytmów ekspresyjne stosunkowo proste i stosunkowo szybko, ale nie ma dużo elastyczności. Więc zrobić jeszcze kilka rzeczy, które mamy zamiar spojrzeć na dzisiaj musieliśmy zrobić bardziej skomplikowane wyrażenie regularne implementacje, które są potencjalnie znacznie wolniej, tak, że jest coś, aby pamiętać Istnieje również regularne odmowa wyrażenia odmiany ataku że wykorzystanie potencjału tych nowszych implementacjach wyrażenia regularne, aby stać się bardzo skomplikowane. I w bardzo sensie samej, którą widzieliśmy w atakami przepełnienia bufora, masz ataki, które działają poprzez cykliczne pętle przekroczenia pojemności pamięci. A tak przy okazji Regexen jest jednym z oficjalnych mnogiej o wyrażenie regularne przez analogię do wołów w anglosaskim. Okay, więc Library Python wielu z was tutaj osobiście mieć Mac, więc rzeczywiście można wyciągnąć to się na ekranie. Wyrażenia regularne są wbudowane w Pythonie. A więc Python jest fabrycznie na komputerach Mac, a także dostępny w sieci pod tym linkiem. Tak więc jeśli oglądasz można zatrzymać i upewnić się, że Python jak grać tutaj. Nie ma obsługi online, więc jeśli po prostu wpisz Pythona do komputera widać, że wersja pojawia się w terminalu. Więc podałem link do instrukcji dla wersji 2 Pythona, a także ściągawki. Istnieje wersja 3 Pythonie, ale Mac nie musi się z tym fabrycznie. Więc nie za bardzo różne. Okay, więc pewne podstawy korzystania z wyrażeń regularnych w Pythonie. Więc użyłem bardzo prostego wyrażenia, więc zrobiłem re import Python a następnie wziął wynik re.search. I szukaj trwa 2 argumenty. Pierwszym z nich jest wyrażenie regularne, a drugi jest tekst lub napis, który chcesz przeanalizować. A potem wydrukować na result.group. Więc to są 2 podstawowe funkcje mamy zamiar zobaczyć dziś w nauce o wyrażeniach regularnych. Więc po prostu niszczy to wyrażenie tutaj h, a następnie \ w, a następnie m tak \ w po prostu akceptuje każdą literę alfabetu tam. Więc szukamy dla "h", a następnie kolejny znak alfabetyczny a następnie m, więc tutaj, że będzie pasował do szynki w, "Abraham Lincoln i szynka kanapki." Jest to wynikiem tej grupy. Inna sprawa, że ​​możemy zrobić, to skorzystać z naszych przed ciągi tekstu w Pythonie. Sądzę więc, że pójdę dalej i wyciągnąć, że tutaj. Re import Python. I gdybym miał zrobić to samo - powiedzmy tekst, "Abraham", pozwalają nam przybliżyć - nie idziemy. Tekst brzmi: "Abraham zjada ham". Okay, a następnie doprowadzić re.search =. I wtedy nasze wyrażenie może być h, a następnie zrobię dot m. Więc dot po prostu ma żadnego znaku, który nie jest nowa linia w tym numery, Znaki procentowych, coś podobnego. A potem tekst - Boom - i wtedy result.group--tak. Tak to jest, jak do realizacji podstawowych funkcji tutaj. Gdybyśmy mieli pierścień tekst, który - że szalony tekst - zawiera powiedzieć wiele ukośników odwrotnych i ciągi wewnątrz i rzeczy, które mogłyby wyglądać sekwencje, wtedy prawdopodobnie chcesz użyć surowego wprowadzania tekstu, aby upewnić się, że jest akceptowane. I to właśnie tak wygląda. Jeśli więc szukaliśmy dla każdego z nich tam nie powinniśmy znaleźć coś. Ale to jest jak można wdrożyć go, tuż przed ciągiem wyrażenie regularne można umieścić literę r. Ok, więc niech nam dalej. Wszystko w porządku - więc spójrzmy na kilka wzorów powtarzalnych tutaj. Więc jedna rzecz, którą chcesz zrobić, to powtarzać rzeczy jak szukasz przez tekst. Tak, aby zrobić, a następnie dowolną liczbę b - robisz * ab. A potem są serią innych reguł też. I można szukać wszystkich tych działalności; Ja po prostu uruchomić poprzez niektóre Najczęściej używane z nich. So ab + jest następnie każde N większa niż 0 z b.. ab? jest następnie przez 0 lub 1 z B. AB {N} jest następnie N do B, a następnie tak dalej. Jeśli masz 2 numery w nawiasy, użytkownik określa zakres , które mogą być ewentualnie dopasowane. Będziemy więc przyjrzeć się na kilka wzorów powtarzalnych w minutę. So 2 rzeczy, o których warto pamiętać podczas korzystania z tych wzorzec dopasowania tools tutaj. Tak mówią chcemy spojrzeć na hm, "Abraham Lincoln robi kanapki z szynką". Więc zmieniłem imię Abrahama Lincolna do Abrahama. A teraz szukamy tego, co jest zwracany przez funkcję wyszukiwania a tylko zwraca szynkę w tej sprawie. I robi to, ponieważ search prostu naturalnie zajmuje lewy najwięcej kolejkę. I wszystkie wyrażenia regularne, chyba że określono inaczej zrobić. Jeśli chcemy, aby znaleźć wszystko, co jest funkcją tego - znaleźć wszystko. Tak, że może po prostu wyglądać jak wszystkie = re.findall ("h.m", tekst) a następnie all.group (). Wszystko produkuje zarówno szynki i szynki, w tym przypadku oba ciągi w Abrahama każdego szynki. Tak, że ma innej opcji. Great. Inną rzeczą, aby pamiętać, że wyrażenia regularne się największym intuicyjnie. Spójrzmy na ten przykład. Zrobiliśmy to szukać najbardziej na lewo, a potem próbował większą search używając Kleene operatora gwiazdy. Więc dla "Abraham Lincoln sprawia kanapki z szynką", a ja tylko wróciłam m wyniku. Powodem tego błędu było, że mogłem wziąć dowolną liczbę h dlatego, że nie określił by wszystko między h i m. Tylko przykład tam, że miał m - tam tylko przykłady w nim z m. oraz numerem H-tych były po prostu m ciąg. Potem próbowałem jeszcze raz, powiedziałem: "Dobrze, niech nam uzyskać rzeczywisty największą grupę tutaj." A potem zrobiłem godziny. * M, tak, że po prostu zwraca dowolną liczbę znaków między h i m. A jeśli dopiero zaczynasz i myśleć: "Och, dobrze, dobrze będzie daj mi szynkę ", to faktycznie ma wszystko od godz w Abraham Lincoln aż do końca szynki. To jest chciwy; widzi h - to wszystko inne teksty - m, i to jest to, czego potrzeba w. Jest to szczególnie rażące - jest to cecha możemy również określić na to nie być chciwym korzystania z innych funkcji. Ale to jest coś, musimy pamiętać, zwłaszcza patrząc na tekst HTML, który jest jednym z powodów, że wyrażenia regularne są trudne dla HTML. Bo jeśli masz otwarte tag HTML, a następnie wiele rzeczy w środku i niektóre inne HTML zamknięty tag znacznie później w programie, właśnie zjedzone dużo kodu HTML prawdopodobnie przez pomyłkę. Wszelkie prawa - więc więcej znaków specjalnych, tak jak wiele innych języków, uciec za pomocą ukośnika. Można więc użyć kropki do określenia dowolnego znaku z wyjątkiem nowej linii. Możemy użyć do ucieczki w, aby określić dowolną literę alfabetu. I przez d ucieczki analogia dowolną liczbą całkowitą - znak numeryczny. Możemy określić - możemy użyć nawiasów aby określić związanych wyrażeń. Więc to zaakceptuje, B lub C. Możemy także określić lub opcje A lub B. Na przykład - jeśli szukaliśmy wielu możliwości w nawiasach możemy użyć operatora OR, jak w - więc niech nam wrócić do tego np. tutaj. A teraz weźmy - wróćmy do tego przykładu tutaj, a następnie podjąć ae - tak to powinno powrócić - Myślę, że to jest nadal Abrahama. Więc - jeśli zrobimy wszystko - świetnie. Więc niech nam aktualizować tekst tutaj. "Abraham zjada szynkę podczas podszywania jego -. Podczas zawijania" Great. All. Great. Teraz mamy szynka, szynka, i brzeg. Podczas zawijania - nucąc mu - nucąc do rąbka niego. Great. Samo. Teraz powraca wciąż tylko szynka, szynka, i hem bez podnoszenia na szum lub niego. Great - więc co jeśli chcemy patrzeć albo że - tak możemy również zrobić on czy - wrócimy do tego. Okay - tak - wszystko w porządku - w pozycji można także użyć daszka lub dolara aby określić, że szukasz czegoś na początku lub na końcu łańcucha. Albo początek lub koniec słowa. To jest jeden sposób, aby użyć. Okay - więc niech nam bawić z nieco większej bloku tekstu. Powiedzmy, że ten wiersz tutaj - to stwierdzenie tutaj. Moc wyrażenia regularnego jest to, że można je określić wzory nie tylko fixed znaków. Uczyńmy - nazwijmy ten blok. Wtedy będziemy czytać wszystko to w. I wtedy - uczyńmy wszystko =, więc co to są pewne rzeczy, może szukamy tutaj zyskiem? Możemy szukać ucha ekspresji. Nie bardzo interesujące. Jak o tym? Zobaczymy, co się wydarzy. Dałem problem. Tak więc dowolna liczba rzeczy przed ponownym wszystkich. Tak, że powinna wrócić wszystko od początku aż do wszystkich re być może kilka razy. I to tutaj mamy moc wyrażeń regularnych jest to, że może określić wzory nie tylko postacie są tutaj. Więc wszystko aż do ostatecznej re, to zaczęło się od lewej najbardziej i był chciwy. Zobaczymy - co jeszcze możemy szukać. Myślę, że jedną rzecz, jeśli jesteś zainteresowany w poszukiwaniu zaimków ona i on, można sprawdzić s jest równe 0 lub 1 i wyrażenie go, i że prawdopodobnie nie wrócić - oh, myślę, że wrócił, bo nie mamy do czynienia z mocą, że dzień, tutaj są. Spróbujmy podając, że ma przyjść na początku coś. Pozwól nam sprawdzić, czy spada. Tak więc możemy zrobić, tłuszcz, i nie mamy nic, bo ona i on nie występuje w tym zdaniu. Great. Okay - więc z powrotem do kota tutaj. Tak skomplikowane wzory krzywdzi mózg. Więc dlatego też użyć wyrażeń regularnych, aby uniknąć tych problemów. Więc oto kilka innych przydatnych trybów można bawić się. Patrzyliśmy na wyszukiwanie dzisiaj, ale można również użyć mecz, Split, FindAll oraz grup. Więc inne fajne rzeczy można zrobić z wyrażeń regularnych oprócz właśnie poszukuje wzorców bierze wzór i trzyma wszystkie mecze - jej zmienne - a następnie używając tych w kodzie później. To może być bardzo pomocne. Inne rzeczy można liczyć. Więc możemy policzyć liczbę wystąpień wzorca wyrażenia regularnego, i to jest to, co możemy używać grup do. I inne środki, jak również są możliwe. Więc po prostu chcę porozmawiać trochę więcej na temat innych sposobów korzystania z wyrażeń regularnych. Więc jedna zaawansowana aplikacja jest rozmyty dopasowywania. Więc jeśli szukasz tekstu do wypowiedzi, Julius Caesar, i widzisz albo Gajusza Juliusza Cezara lub nazwa Juliusza Cezara w innych językach, następnie możesz również przypisać pewną wagę do tych wartości. A jeśli jest to na tyle blisko, - jeżeli przekroczy pewien próg - to chcesz aby móc zaakceptować Juliusza Cezara. Tak więc istnieje kilka różnych implementacji za to w kilku innych językach, jak również. Oto kilka innych narzędzi, Regex Pal - mało poręczne app forum do sprawdzić, czy twój wyrażenia regularne są zbudowane prawidłowo. Istnieją również samodzielne narzędzia, które można uruchomić z poziomu pulpitu jak Ultra Pico, i jak również kucharskie tylko. Więc jeśli ten projekt, który obejmuje mnóstwo wyrażeń regularnych jest to prawdopodobnie miejsce, aby przejść poza zakresem dzisiaj. A potem po prostu dać ci poczucie, jak powszechne jest jest grep w systemie Unix, Perl posiada wbudowane, a C jest PCRE dla C. A potem wszystkie te inne języki też wyrażenie regularne pakiety które działają z zasadniczo składni samym dostaliśmy smak dzisiaj. PHP, Java, Ruby, i tak dalej. Google Code Search jest rzeczywiście warto wspomnieć, jest to jeden z stosunkowo niewiele aplikacji, które obecnie nie pozwala na dostęp do publicznych jego bazy danych za pomocą wyrażeń regularnych. Więc jeśli spojrzeć na Google Code Search można znaleźć kod jeśli szukasz instancji, jak funkcja może być używany, można użyć wyrażenia regularnego, aby znaleźć tę funkcję jest używany w różnego rodzaju różnych przypadkach. Można szukać fwrite, a następnie można szukać flaga zapisu lub odczytu gdybyś przykład fwrite są używane w tym przypadku. Tak samo jest i tutaj są pewne odniesienia. To będzie dostępna w Internecie, tak więc idzie do przodu w razie chcesz wyglądać w Pythonie, grep, Perl - po prostu chcesz trochę inspiracji lub jeśli chcesz wyglądać bardziej na teorii oto niektóre dobre skoki z miejsc. Dziękuję bardzo. [CS50.TV]