Załóżmy, że masz taki tekst:
1 |
<span class="pln">message </span><span class="pun">=</span> <span class="str">'Document "cv.doc" was printed on printer: XEROX'</span> |
z tego napisu chcesz wyciąć tylko nazwę dokumentu cv.doc. Można by to zrobić posługując się zwykłymi poleceniami pracującymi na napisach, ale nie jest to zbyt wygodne rozwiązanie – trzeba się sporo przy tym napracować, a na dodatek kod będzie nieczytelny, trudny do poprawy i niewydajny.
Za to z pomocą mogą przyjść wyrażenia regularne, np
1 |
\"(.*)\" |
- Kropka to dowolny znak
- * oznacza dowolną ilość wystąpień tego znaku
- Nawiasy służą do grupowania
- \” – oznacza dopasoanie/wyszukiwaniecudzysłowiów
Żeby skorzystać z wyrażeń regularnych zaimportuj moduł re a potem funką findall wyszukaj wystąpień podnapisów zawartych w tekście
1 2 3 4 |
<span class="kwd">import</span><span class="pln"> re </span><span class="pln">matches </span><span class="pun">=</span><span class="pln"> re</span><span class="pun">.</span><span class="pln">findall</span><span class="pun">(</span><span class="pln">r</span><span class="str">'\"(.*)\"'</span><span class="pun">,</span><span class="pln">message</span><span class="pun">) </span><span class="kwd">for</span><span class="pln"> m </span><span class="kwd">in</span><span class="pln"> matches</span><span class="pun">: </span><span class="kwd"> print</span><span class="pun">(</span><span class="pln">m</span><span class="pun">)</span> |
Komentarze:
A czy można zastąpić * określona liczba? Ze chce, żeby tylko ileś określonych tych znaków wyświetliło?